我正在使用最新的mybatis版本,即mybatis3.2.2。
我已将EJB CMP上的旧应用程序转换为mybatis,其中新转换的mybatis代码性能比使用EJB CMP的旧代码差得多。
mybatis的配置设置如下:
<settings>
<setting name="cacheEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="false" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="jdbcTypeForNull" value="VARCHAR"/>
<setting name="defaultExecutorType" value="REUSE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
在通过YJP分析器分析性能问题时,我意识到HashTable.put(<mybatis returned Pojo>, <value>)
方法大部分时间都在使用,并且似乎是唯一的bottoleneck。
在HashTable.put()
方法中,我们将从mybatis返回的Pojo作为关键。在哪个调用,反过来它调用该pojo的hashCode,并且从YJP我可以看到在'hashCode'方法中,它调用'org.apache.ibatis.executor.loader.CglibProxyFactory$EnhancedResultObjectProxyImpl.intercept(Object, Method, Object[], MethodProxy)'
,这实际上看起来像调用jdbc驱动程序并加载这个pojo属性和那些是一次性的。
请问帮助和指导我,为什么mybatis尝试加载Pojo,同时在 hashCode 方法中加入 HashTable ?另外,如果可以的话,我们如何才能改善其表现。
另外,我试图覆盖'hashCode'&amp; 'equals'方法进入我的Pojo并使用/仅比较主键属性,但似乎没有效果,它仍然调用ibatis的'executor.loader'并做同样的事情。
答案 0 :(得分:1)
好的,我终于找到了解决方案。 'lazyLoadTriggerMethods'设置配置触发延迟加载的方法。
默认情况下,它会触发'equals,clone,hashCode,toString'方法的延迟加载。 我在SqlMapConfig.xml中配置了这个属性,并从中删除了'equals,hashCode,toString'方法,如下:
<settings>
<!-- below both entry required to achieve on-demand lazy loading -->
<setting name="aggressiveLazyLoading" value="false" />
<setting name="lazyLoadingEnabled" value="false" />
<setting name="jdbcTypeForNull" value="VARCHAR" />
<setting name="defaultExecutorType" value="REUSE"/>
<setting name="defaultStatementTimeout" value="25000"/>
<setting name="lazyLoadTriggerMethods" value="clone"/>
</settings>
注意:只有在确定hashCode和equals实现不使用延迟加载属性或使用访问器方法读取延迟加载属性时,才应执行此操作。
它大大提高了性能。
谢谢,
Parag