- 浏览: 577169 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a1641693970:
还不错,学习了
BeanUtils使用总结(二)LazyDynaBean -
zjfshowtime:
很好的办法,学习了。
ORA-28001: the password has expired -
ya654277yo:
哦,多谢分享
Apache整合Tomcat后get方式提交中文乱码问题解决 -
foolkeeper:
nice !!
jvm内存参数设定 -
tracy821:
谢谢了,找了好久才找到
关于Spring 声明式事务处理时,throws exception不回滚的问题
sqlmap-config.xml 配置如下:
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
maxTransactions="20"
maxRequests="32"
maxSessions="20"
errorTracingEnabled="true"
useStatementNamespaces="true"
/>
User.xml配置:
<cacheModel id="userCache" type="OSCACHE">
<flushInterval hours="24"/>
<flushOnExecute statement="User.updateUser"/>
<property name="size" value="1000" />
</cacheModel>
<resultMap id="UserResult" class="User">
<result property="username" column="nodeName"/>
<result property="address" column="hrefAddress"/>
</resultMap>
<select id="getUserbyUsername" resultMap="UserResult" cacheModel="userCache">
select hrefAddress,nodeName from tree_table WHERE nodeName like '%$username$%'
</select>
<update id="updateUser" parameterClass="User">
update
tree_table
set hrefAddress = #address#
where nodeName = #username#
</update>
oscache.properties配置如下:
# 是否使用内存作为缓存空间
cache.memory=true
cache.key=_oscache_cache
# 如果使用磁盘缓存(cache.memory=false),则需要指定磁盘存储接口实现
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
# ie Windows:
cache.path=D:\\dcache
# 缓存调度算法
cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache
# 内存中缓存的最大容量
cache.capacity=1000
运行报错:
com.opensymphony.oscache.base.persistence.CachePersistenceException: Unable to write 'D:\dcache\application\1184404535|1614558766.cache' in the cache. Exception: java.io.FileNotFoundException, Message: D:\dcache\application\1184404535|1614558766.cache (文件名、目录名或卷标语法不正确。)
at com.opensymphony.oscache.plugins.diskpersistence.AbstractDiskPersistenceListener.store(AbstractDiskPersistenceListener.java:376)
at com.opensymphony.oscache.plugins.diskpersistence.AbstractDiskPersistenceListener.store(AbstractDiskPersistenceListener.java:238)
at com.opensymphony.oscache.base.algorithm.AbstractConcurrentReadCache.persistStore(AbstractConcurrentReadCache.java:1113)
at com.opensymphony.oscache.base.algorithm.AbstractConcurrentReadCache.put(AbstractConcurrentReadCache.java:1616)
at com.opensymphony.oscache.base.algorithm.AbstractConcurrentReadCache.put(AbstractConcurrentReadCache.java:863)
at com.opensymphony.oscache.base.Cache.putInCache(Cache.java:624)
at com.opensymphony.oscache.base.Cache.putInCache(Cache.java:601)
at com.opensymphony.oscache.general.GeneralCacheAdministrator.putInCache(GeneralCacheAdministrator.java:270)
at com.ibatis.sqlmap.engine.cache.oscache.OSCacheController.putObject(OSCacheController.java:70)
at com.ibatis.sqlmap.engine.cache.CacheModel.putObject(CacheModel.java:318)
at com.ibatis.sqlmap.engine.mapping.statement.CachingStatement.executeQueryForObject(CachingStatement.java:80)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:565)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:540)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:84)
at net.chinaideal.samples.ibatis.dao.UserDAOImpl.getUserByUsername(UserDAOImpl.java:36)
at net.chinaideal.samples.ibatis.test.TestDAO1.main(TestDAO1.java:63)
问题出在Ibatis生成OScache缓存文件时,命名规则与Windows 文件系统冲突(因为在Windows中,文件名不能包含下面任何字符: \ / : * ? " < > | ,或文件名不能过长)。
找到问题后就可以开始对症下药了:
从文件名“D:\dcache\application\1184404535|1614558766.cache ",可以看出,缓存文件名是按照查询语句参数等生成的。
于是找到生成文件名的类:iBatis 的 com.ibatis.sqlmap.engine.cache.CacheKey,它的 toString() 方法返回值就是文件名:
public
String toString() {
StringBuffer returnValue =
new
StringBuffer().append(hashcode).append(
'|'
).append(checksum);
for
(
int
i=
0
; i < paramList.size(); i++) {
returnValue.append(
'|'
).append(paramList.get(i));
}
return
returnValue.toString();
}
上面代码生成的文件名就可能包含竖线符号("|"),这在 Windows 平台是不允许的,在 Linux 下是不受此约束的。为了能让 iBatis 在使用文件缓存时保持平台独立性, 在该 toString() 方法最后返回时把 | 换成都能够接受的符号,比如 -,即把 return 语句改为:
return returnValue.toString().replace('|', '-');
可以把修正编译好的 CacheKey.class 替换掉 iBatis jar 包中的相应位置的 CacheKey.class。
问题解决了,但还是得注意几点:
1. 即使是使用其它缓存实现,也都是由这个 CacheKey 来生成 Key 的,所以若有可能使用其它缓存组件,缓存文件时同样有可能出现类似的问题。
2. 如果 CacheKey 在结合 SQL 和 参数生成的文件名过长可能也会是个问题,受限于不同的文件系统。设置的缓存目录不要过深,适时完全自定 toString() 方法。
3. 还有,关于是从缓存中取数据还是从数据库取得问题,这个 CacheKey 的 equals() 方法值得细究
发表评论
-
Spring 多数据源声明式事务控制(PlatformTransactionManager )
2014-04-11 18:31 4722首先是TransactionManager的配置: ... -
Spring 动态数据源(AbstractRoutingDataSource )
2014-04-11 18:25 1662Spring动态配置多数据源,即在大型应用中对数据进行横向 ... -
(转)Spring Security 3.0 多页面登录配置
2012-10-19 17:01 5431网上很多文章是关于Spri ... -
Spring 中集成 JOTM 配置 JTA 事务
2011-12-27 19:52 1594Spring 中集成 JOTM 配置 JTA 事务: ... -
Spring 3.1整合EhCache
2011-08-29 16:42 1461Spring 3.1提供了对cache的 ... -
spring集成xfire教程
2011-04-02 15:20 1594配置web.xml <!-- SPRING ... -
关于Spring 声明式事务处理时,throws exception不回滚的问题
2010-09-29 23:31 9010前一段时间,项目代码评审,发现有TX不使用Spri ... -
iBatis SqlMap 的配置总结 收藏
2010-07-22 14:30 3755核心提示:SqlMap的配 ... -
ibatis oscache 使用中miss cache
2010-06-10 13:17 2890原始配置信息: <cacheModel id=&quo ... -
Hibernate+ehcache二级缓存技术
2010-02-01 20:57 9251、首先设置EhCache,建立配置文件ehcache.XML ... -
Hibernate的缓存讨论
2010-02-01 20:50 1118一般系统中有三种情况 ... -
OpenSessionInView Filter 但是发现不生效(转载)
2010-01-25 15:35 1790今天有一个朋友问了我一个问题,他使用的是Hibernate/S ... -
spring有三种启动方式,使用ContextLoaderServlet,ContextLoader
2010-01-19 17:25 1170spring有三种启动方式,使用ContextLoaderSe ... -
ApplicationContext和BeanFactory的关于单实例bean装载的区别
2010-01-19 17:04 1236Bean工厂延迟载入所有的Bean,直到getBean()方法 ... -
Spring AOP 学习小结(转载)
2010-01-06 21:24 1448一、AOP 概念 Joinpoint ... -
AOP术语(转载)
2010-01-06 21:04 1035AOP术语(转载) 2009-07-16 22:12 ... -
spring Lookup方法注入(转)---cglib解决子类过多问题、重构
2010-01-06 17:33 5930“Lookup方法”可以使Spri ... -
Spring JTA应用之Atomikos配置
2010-01-05 23:17 3759Atomikos,是一个基于Java的开源事务管理器,提供了事 ... -
多对多关系中Set的查询
2010-01-05 22:27 1097多对多关系中Set的查询 一个老师教多个学生,一个学生 ... -
ibatis 使用 in子句
2009-09-28 18:44 1877因为in的性能问题,平常不怎么用。今天特殊需求,在ibatis ...
相关推荐
其主要组成部分包括:SqlMapConfig.xml(全局配置文件)、Mapper.xml(SQL映射文件)以及对应的.NET接口或实体类。 配置数据库连接: 在使用IBatis.net时,首要任务是配置数据库连接。全局配置文件SqlMapConfig.xml...
本篇文章将深入探讨如何使用XML配置文件来配置iBATIS,以解决你在实际开发中可能遇到的各种问题。 首先,我们了解iBATIS的核心概念——映射器(Mapper)。映射器是定义SQL语句的地方,而XML配置文件是映射器的主要...
ibatis 实例 配置 源码 依赖包 ibatis-2.3.4.726.jar commons-logging-api.jar commons-logging-1.1.jar commons-dbcp-1.2.2.jar commons-pool.jar
通过上述解析,我们可以看出ibatis配置文件在ibatis框架中的核心地位,它不仅定义了数据源和事务管理策略,还指定了SQL映射文件的位置,使得ibatis能够根据配置正确地执行SQL语句,完成数据库操作。
很好的spring+ibatis事务的配置文档.
给定的XML配置文件展示了如何在Spring中配置ibatis数据源以及ibatis事务管理器。首先,注释掉的`BasicDataSource`部分是用来配置数据源的,这里没有启用,而是选择了使用JNDI数据源。实际生产环境中,通常会使用...
本资料包包含了关于iBatis语法和常用方法的全面介绍,帮助开发者深入理解并熟练运用iBatis进行数据库操作。 首先,`iBatis 2.3.4 api.chm`是iBatis 2.3.4版本的API参考手册,包含了所有类和接口的详细说明,是学习...
### ibatis配置文件信息 #### 一、简介 在Java开发领域中,ibatis(现称为MyBatis)是一款优秀的持久层框架,它通过XML或注解的方式将接口方法与SQL语句绑定起来,实现对象关系映射(ORM)功能。ibatis的主要优势...
在配置iBatis3.0时,可能会遇到各种小错误,这些错误往往由于不正确的配置、依赖缺失或者编码问题导致。以下是对这个主题的详细解释。 首先,让我们了解iBatis是什么。iBatis是一个优秀的持久层框架,它允许开发者...
下面,我们将详细探讨Ibatis的配置文件、映射文件以及其在实际应用中的使用。 一、Ibatis配置文件 Ibatis的主要配置文件是`mybatis-config.xml`,它是整个系统的全局配置文件。这个文件中包含了数据源、事务管理器...
Ibatis基本配置---[环境搭建
首先,iBatis 的 Cache 键(key)是由多个因素组成的,包括对象的hashCode、checksum、查询参数、sqlmap ID、SQL语句以及调用方法名。由于这些因素的多样性,即使是微小的参数变化也会导致不同的Key,从而确保缓存的...
此文本主要是关于ibatis总配置和映射配置和一些需要主要的细节。
Ibatis的核心功能包括映射器(Mapper)和SqlSession,通过XML或注解方式定义SQL语句和结果映射。 ### Ibatis配置详解 1. **全局配置文件(ibatis-config.xml)** 全局配置文件是Ibatis系统的起点,它包含了数据源...
标题中提到的“常用ibatis配置”指的是在使用iBatis这一数据持久层框架中,常见的配置用法和技术点。iBatis(现称为MyBatis)是一个流行的Java持久层框架,它通过使用XML或注解的方式,将SQL语句与对象进行映射,...
标题 "ibatis配置文件自动加载组件" 涉及的核心技术是MyBatis的自动配置加载功能,这在开发过程中极大地提高了效率,使得开发者无需每次修改XML映射文件后手动重启服务。MyBatis是一个优秀的Java持久层框架,它简化...
"spring+ibatis配置实例"这个项目提供了一个完整的开发环境,包含所需的依赖包和标准化的项目结构,对初学者或开发者来说极具价值。 Spring是一个全面的Java应用框架,它提供了依赖注入(Dependency Injection,DI...
Ibatis通过XML或注解方式配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 在"ibatis配置"中,主要涉及以下几个关键知识点: 1. **...
在传统的XML配置文件中,Ibatis允许我们定义SQL语句、参数映射以及结果集映射。然而,随着Java注解的普及,Ibatis也支持使用注解来进行配置,使得代码更加简洁易读。 1. **@Select**: 这个注解用于标记一个方法,该...