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