首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

iBATIS缓存的异常使用

2012-10-19 
iBATIS缓存的错误使用标王2.0中用到了ibatis内置的缓存机制,昨天在自测时发现缓存不起作用,其实以前在bp和

iBATIS缓存的错误使用
  标王2.0中用到了ibatis内置的缓存机制,昨天在自测时发现缓存不起作用,其实以前在bp和bss中都有遇到过这种情况,但一直都没太在意。今天仔细查下原因,发现了问题。

下面是bp中cacheMode的配置

<cacheModel id="MEMORY-CACHE" type="MEMORY" readOnly="true"     serialize="false">     <flushInterval hours="24" />     <property name="STRONG" value="STRONG" /></cacheModel>


问题出现在<property name="STRONG" value="STRONG" />中,property name的配置中没有strong这个属性,所以这么配相当于是无效的。
正确的配置应该是<property name="reference-type" value="STRONG" /> 或 <property name=" referenceType " value="STRONG" />

再来看ibatis源码中是怎么读取这个配置的
private MemoryCacheLevel cacheLevel = MemoryCacheLevel.WEAK;  private Map cache = Collections.synchronizedMap(new HashMap());  public void configure(Properties props) {    String refType = props.getProperty("reference-type");    if (refType == null) {      refType = props.getProperty("referenceType");    }    if (refType != null) {      cacheLevel = MemoryCacheLevel.getByReferenceType(refType);    }  }  public void putObject(CacheModel cacheModel, Object key, Object value) {    Object reference = null;    if (cacheLevel.equals(MemoryCacheLevel.WEAK)) {      reference = new WeakReference(value);    } else if (cacheLevel.equals(MemoryCacheLevel.SOFT)) {      reference = new SoftReference(value);    } else if (cacheLevel.equals(MemoryCacheLevel.STRONG)) {      reference = new StrongReference(value);    }    cache.put(key, reference);  }


从以上代码中可以看到,当出现错误的配置时,cacheLevel使用了默认的 MemoryCacheLevel.WEAK,而weak类型的内存管理机制是只要jvm启动了垃圾
回收机制,缓存所使用的内存就被回收,相当于这种错误的配置使用ibatis缓存基本上是失效的。

目前bp、bss中好几处地方都用了这样的配置,包括违禁词、地区省市编号。

热点排行