快速业务通道

iBatis使用OSCache作缓存与java.io.FileNotFoundException异常 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
情况) 的 Key,这个 Key 是基于查询语句(含查询条件) 生成的。实现类是 iBatis 的 com.ibatis.sqlmap.engine.cache.CacheKey,它的 toString() 方法返回值就是文件名:

1.public String toString() { 2.StringBuffer returnValue = new StringBuffer().append(hashcode).append(''|'').append(checksum); 3.for (int i=0; i < paramList.size(); i++) { 4.returnValue.append(''|'').append(paramList.get(i)); 5.} 6. 7.return returnValue.toString(); 8.}

上面代码生成的文件名就可能包含竖线符号("|"),这在 Windows 平台是不允许的,在 Linux 下是不受此约束的。为了能让 iBatis 在使用文件缓存时保持平台独立性,我们的 Fix 办法可使在该 toString() 方法最后返回时把 | 换成都能够接受的符号,比如 -,即把 return 语句改为:

return returnValue.toString().replace(''|'', ''-'');

可以把修正编译好的 CacheKey.class 替换掉 iBatis jar 包中的相应位置的 CacheKey.class,或者若是 Web 应用,可直接放在 classes 目录中正确位置上,因为 classes 中散装的类文件要优先于 jar 包中的类得到加载。

问题需解决了,但还是得注意几点:

1.即使是使用其它缓存实现,也都是由这个 CacheKey 来生成 Key 的,所以若有可能使用其它缓存组件,缓存文件时同样有可能出现类似的问题。

2.如果 CacheKey 在结合 SQL 和 参数生成的文件名过长可能也会是个问题,受限于不同的文件系统。设置的缓存目录不要过深,适时完全自定 toString() 方法。

3.还有,关于是从缓存中取数据还是从数据库取得问题,这个 CacheKey 的 equals() 方法值得细究,这是我的后话了。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号