読者です 読者をやめる 読者になる 読者になる

山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

Hibernate3.2のNative Queryのメモリリーク続き

デバッガで追ってみました。
QueryParameterにListがある場合、キャッシュの中にあるかどうか検索するときにはListを分解したSQLで検索していますがキャッシュするときにはListを分解する前のSQLで追加しています。結果として常に存在確認するSQLはキャッシュの中に見つからず、同じSQLが重複してどんどんキャッシュに追加されていってしまいます。

コード例

sql.append("where ctl.shouhin_id in (:shouhinIdList) ");
略
sqlQuery.setParameterList("shouhinIdList", shouhinIdList);

キャッシュの中にあるかどうか検索するときはこんなふうに展開されています。

where ctl.shouhin_id in (:shouhinIdList0_, :shouhinIdList1_, :shouhinIdList2_, :shouhinIdList3_, :shouhinIdList4_, :shouhinIdList5_, :shouhinIdList6_, :shouhinIdList7_, :shouhinIdList8_, :shouhinIdList9_, :shouhinIdList10_, :shouhinIdList11_, :shouhinIdList12_, :shouhinIdList13_, :shouhinIdList14_, :shouhinIdList15_, :shouhinIdList16_, :shouhinIdList17_, :shouhinIdList18_, :shouhinIdList19_, :shouhinIdList20_, :shouhinIdList21_, :shouhinIdList22_, :shouhinIdList23_, :shouhinIdList24_, :shouhinIdList25_, :shouhinIdList26_)  

しかしキャッシュされるときには展開前の状態で追加されています。

where ctl.shouhin_id in (:shouhinIdList) 

なのでバグと言っていいでしょう。最新版では直っているのでしょうか。