最新の 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>)
メソッドにほとんどの時間がかかっており、唯一のボトルネックであるように思われることに気付きました。
メソッドでは、HashTable.put()
mybatis から返された Pojo をキーとして入れています。どの呼び出しで、その pojo の hashCode を呼び出し、YJP から、「hashCode」メソッドで呼び出していることがわかりました'org.apache.ibatis.executor.loader.CglibProxyFactory$EnhancedResultObjectProxyImpl.intercept(Object, Method, Object[], MethodProxy)'
。これは、実際には jdbc ドライバーを呼び出して、この pojo プロパティをロードするように見えます。当時の。
hashCodeメソッドでHashTableに入れているときに mybatis が Pojo をロードしようとしている理由を教えてください。また、可能な場合、どのようにパフォーマンスを改善できますか。
また、「hashCode」および「equals」メソッドを Pojo にオーバーライドして、主キー プロパティのみを使用/比較しようとしましたが、効果がないようで、ibatis の「executor.loader」を呼び出して同じことを行っています。