将mybatis返回的POJO放入HashTable会降低性能,因为mybatis尝试在其hasCode方法中加载pojo

时间:2013-05-11 11:31:56

标签: mybatis

我正在使用最新的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'并做同样的事情。

1 个答案:

答案 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