私はプロファイラの下でアプリケーションをテストし、SQL文字列が私のメモリの約30%を使用していることを知りました!これは奇妙です。Hibernateはすべてのクエリに対して異なるSQLを生成します
このような文字列がアプリメモリに格納されています。これは、Hibernateによって生成されたSQLクエリで、異なる番号をメモして末尾のアンダースコア:ここ
select avatardata0_.Id as Id4305_0_,...... where avatardata0_.Id=? for update
select avatardata0_.Id as Id4347_0_,...... where avatardata0_.Id=? for update
は、私が理解できない部分です。なぜハイバーネーションは、クエリごとに "Id4305_0_"のような異なる識別子を持つ異なるSQL文字列を生成する必要がありますか?すべての同じクエリに1つのクエリ文字列を使用できないのはなぜですか?これはクエリキャッシングをバイパスするための何らかのトリックですか?
誰かが私になぜそれが起こっているのか、そのようなリソースの浪費を避ける方法を説明すると大変感謝します。
UPDATE
[OK]をクリックします。見つけた。私はメモリリークを仮定して間違っていた、それは私のせいだった。 Hibernateは意図したとおりに動作しています。
私のアプリは、10スレッドで121(!)のSessionFactoriesを作成し、SingleTableEntityPersistersのインスタンスを約2300作成しました。また、各SingleTableEntityPersisterは、異なる識別子を持つ約15のSQLクエリを生成します。 Hibernateは約345,000の異なるSQLクエリを生成するように強制されました。すべてがうまくいっていて、奇妙なものではありません:)
あなたは単純なマッピングの設定、テストコードとこのような状況を再現する単純なテーブルのDDLを提供することができればそれが役に立つかもしれません。私の経験では、Hibernateがそのような高いカラム別名インデックスカウントを作成することは決して見たことがありません。 –
良い点。私は明日お試しになります。 :) –
@AndrewFrolov:私の答えがあなたのupdates.In場合は、問題を見つけて訂正して、あなたのupdates.Inとの質問に今フィットすることを願って! – ManuPK