iBatis使用OSCache作缓存与java.io.FileNotFoundException异常

这种异常只会发生在 Windows 平台上,可以说是 iBatis 的一个 Bug,大约 iBatis 的开发测试人员都比较热衷于 Unix 族系的平台,而忽略了 Windows 下的兼容性测试。

出现 FileNotFoundException 异常的情形是这样的:Windows7 + iBatis2.3.0.677 + OSCache2.4.1。

iBatis 中配置使用 OSCache 缓存,在映射文件 Product.xml 中有如下声明片断:

1.<cacheModel type="OSCACHE" id="productCache">
2.<flushOnExecute statement="Product.insert"/>
3.<flushOnExecute statement="Product.delete"/>
4.</cacheModel>
5.
6.<select id="getById" cacheModel="productCache" parameterClass="int" resultClass="Product">
7.select id, name,description as desc1  from test_product where id = #value#
8.</select>

OSCache 的 oscache.properties 中指明用磁盘文件缓存数据,注意以下几个配置:

01.#不缓存到内存
02.cache.memory=false
03.
04.#缓存持久化实现类,磁盘持久化监听器
05.cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
06.
07.#缓存磁盘路径,以后注意观察该目录生成的内容
08.cache.path=e:\\OSCache\\cache
09.
10.#选择一种缓存算法,还可选 FIFOCache、UnlimitedCache
11.cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache

Java 测试代码:

1.public static void main(String[] args) throws Exception{
2.Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
3.SqlMapClient sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
4.System.out.println(sqlMapClient.queryForObject("Product.getById",5));
5.
6.//后面同样的查询将不再查询数据库,而是直接使用前面执行放在缓存中的内容
7.System.out.println(sqlMapClient.queryForObject("Product.getById",5));
8.}

执行上面那段代码,你将会得到异常:

2009-8-19 10:45:52 com.opensymphony.oscache.base.algorithm.AbstractConcurrentReadCache persistStore
严重: [oscache] Exception persisting 1991729862|2162672802|5|Product.getById|62996507|         select id, name,description as desc1  from test_product where id = ?     |executeQueryForObject
com.opensymphony.oscache.base.persistence.CachePersistenceException: Unable to write 'e:\OSCache\cache\application\1991729862|2162672802|5|Product_31getById|62996507|_49_50_51_52_53_54_55_56_57select_64id,_68name,description_85as_88desc1_94_95from_100test_105product_113where_119id_122=_124_125_126_127_128_129_130|executeQueryForObject.cache' in the cache.Exception: java.io.FileNotFoundException, Message: e:\OSCache\cache\application\1991729862|2162672802|5|Product_31getById|62996507|_49_50_51_52_53_54_55_56_57select_64id,_68name,description_85as_88desc1_94_95from_100test_105product_113where_119id_122=_124_125_126_127_128_129_130|executeQueryForObject.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:1623)
at com.opensymphony.oscache.base.algorithm.AbstractConcurrentReadCache.put(AbstractConcurrentReadCache.java:864)
at com.opensymphony.oscache.base.Cache.putInCache(Cache.java:637)
at com.opensymphony.oscache.base.Cache.putInCache(Cache.java:614)
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:566)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:541)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClientImpl.java:83)
at com.unmi.TestClient.main(TestClient.java:25)

时间: 2024-08-04 13:25:49

iBatis使用OSCache作缓存与java.io.FileNotFoundException异常的相关文章

eclipse开发的一个天气预报插件总报java.io.FileNotFoundException异常

问题描述 1.Activator.javapackagemyplugin;importorg.eclipse.jface.resource.ImageDescriptor;importorg.eclipse.ui.plugin.AbstractUIPlugin;importorg.osgi.framework.BundleContext;publicclassActivatorextendsAbstractUIPlugin{//Theplug-inIDpublicstaticfinalStrin

tomcat或jdk版本问题,导致java.io.FileNotFoundException

问题描述 tomcat或jdk版本问题,导致java.io.FileNotFoundException 用apache的httpclient上传文件到另一个服务器,使用tomcat7+jdk1.7当文件名为中文时报下面这个异常,用tomcat7+jdk1.8则不管中英文都会报这个错,用tomcat8+jdk1.8则正常,但是我现在项目里面只能用tomcat7,求朋友们帮助了 java.io.FileNotFoundException: /home/saas/lmsgogogo/.metadata

使用HttpURLConnection下载文件时出现 java.io.FileNotFoundException彻底解决办法

使用HttpURLConnection下载文件时经常会出现 java.io.FileNotFoundException文件找不到异常,下面介绍下解决办法 首先设置tomcat对get数据的编码:conf/server.xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncodin

io流-readUTF()使用报 java.io.EOFException异常

问题描述 readUTF()使用报 java.io.EOFException异常 今天在编程的时候,用到了DataInPutStream类的readUTF()方法时报了个异常,查了好多资料也不能解决,求大神指点啊.高分悬赏. package IO流; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFound

我的Java开发学习之旅------&amp;gt;Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法

今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常. 异常代码如下: java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2554) at java.io.ObjectInputStream.readObject0(ObjectInputSt

server-ClientAbortException: java.io.IOException异常

问题描述 ClientAbortException: java.io.IOException异常 项目在部署后,一直出现这个异常. 原因是手机浏览器在访问时 server返回的是response.getOutputStream().write(byte[]), 手机会当成是下载文件,随即调用了手机内置的下载进程去下载该文件,而浏览器在此时中止了接收http响应,这就导致了server出现了ClientAbortException异常. 而使用电脑Chrome浏览器进行访问的时候,它会自动下载,不

代码-java.io.FileNotFoundException: (设备未就绪。)

问题描述 java.io.FileNotFoundException: (设备未就绪.) 由于重装了系统,重新装了jdk和eclipse,再次打开eclipse的时候,给之前的project重新导入了新安装的jdk,但是仍然有红色的感叹号,以下是运行时的报错: Exception in thread "main" java.io.FileNotFoundException: G: ecommendationKNN atings.dat (设备未就绪.) at java.io.FileI

websphere7.0 :java.io.FileNotFoundException: JSPG0036E: 找不到资源 /login.jsp

问题描述 websphere7.0配置完一切后,部署好应用程序.服务器和应用程序启动都没有问题,正常启动,而且websphere上部署程序,我做过好几次,都是成功的.这次做的方法也是一样的,但是访问时,出现以下问题:JSPG0036E:找不到资源/login.jsp:代码粘贴如下:java.io.FileNotFoundException:JSPG0036E:找不到资源/login.jspatcom.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionP

求助:未捕获到过滤器 java.io.FileNotFoundException

问题描述 00000065filterEcom.ibm.ws.webcontainer.filter.FilterInstanceWrapperserviceSRVE8109W:未捕获到过滤器encodingFilter抛出的异常:java.io.FileNotFoundException:SRVE0190E:找不到文件:/application/null报错如上提示,项目是ssh2上开发,WebSphere版本是8.5这里有一篇可能有价值的文章可参考http://www.frightanic.