“偶们的系统越来越慢了!”,这是最近一直在我耳边萦绕的一句话,向公司里搞数据库的大牛咨询,发现是一些做汇总的语句在作怪,于是决定将这些数据做缓存。
办法想出来后,做起来也容易了。首先入我“法眼”的是ehcache,我们用hibernate,这个家伙是hibernate默认自带的(我们之前做的缓存是自己写的HashTable)。由于我们没有用spring,否则用EhCacheFactoryBean和EhCacheManagerFactoryBean就方便了,偶自己写的缓存接口也是基于这个的,但现在是奢望了,于是自己写cache的初始化。由于论坛的“代码”功能好像用不了,我简单说一下碰到的问题:
我所有的初始化代码都是老老实实按着ehcache官网上的例子写的,唯一的不同在于我们的ehcache是1.1版的,CacheManager的创建必须要用createCacheManager才可以,而不能用new CacheManager();由于我没有换jar包的权力,于是将就了一下。当我准备好一切并且去调试的时候,发现我总是无法找到自己设置的cache,但是初始化cache的xml时没有任何异常。最后通过debug ehcache1.1的src发现,其CacheManager是sington的,有人在我之前初始化过了ehcache,于是我的初始化动作根本没有做。问题很简单了,是hibernate干的,在初始化时,我们先初始化了hibernate,然后初始化自定义的ehcache缓存,导致了问题, 把初始化的顺序改变一下,问题就解决了。
此时方明白Spring中EhCacheManagerFactoryBean注释中的含义:Note: As of Spring 2.0, this FactoryBean will by default create an independent CacheManager instance, which requires EHCache 1.2 or higher. Set the "shared" flag to "true" to create a CacheManager instance that is shared at the VM level (which is also compatible with EHCache 1.1).
发此文以做提醒自己之用。