1

我正在使用最新的 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 profiler 分析性能问题时,我意识到HashTable.put(<mybatis returned Pojo>, <value>)方法占用了大部分时间,并且似乎是唯一的瓶颈。

HashTable.put()方法中,我们将mybatis返回的Pojo作为key。在哪个调用中,它又调用了那个pojo的hashCode,从YJP我可以看到,在'hashCode'方法中,它正在调用'org.apache.ibatis.executor.loader.CglibProxyFactory$EnhancedResultObjectProxyImpl.intercept(Object, Method, Object[], MethodProxy)',这实际上看起来像是调用jdbc驱动程序并加载这个pojo属性,而这些都是一次性的的时间。

任何人都可以帮助和指导我为什么 mybatis 试图加载 Pojo,同时在其hashCode方法中放入HashTable?此外,如果可以的话,我们如何提高它的性能。

另外,我尝试将'hashCode'和'equals'方法覆盖到我的Pojo中并仅使用/比较了主键属性,但它似乎没有效果,它仍在调用ibatis的'executor.loader'并做同样的事情。

4

1 回答 1

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 实现不使用延迟加载属性或使用访问器方法读取延迟加载属性时,才应该这样做。

它显着提高了性能。

谢谢,

段落

于 2013-05-13T15:41:42.950 回答