休眠为每个查询生成不同的 SQL
我刚刚在探查器下测试了我的应用程序,发现sql字符串占用了我大约30%的内存!这很奇怪。
有很多这样的字符串存储在应用程序内存中。这是由休眠生成的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字符串?为什么它不能对所有相同的查询使用一个查询字符串?这是绕过查询缓存的某种技巧吗?
如果有人能描述一下为什么会发生这种情况以及如何避免这种资源浪费,我将不胜感激。
更新
还行。我找到了。我错误地假设内存泄漏,这是我的错。休眠按预期工作。
我的应用程序已创建 121(!)SessionFactories在10个线程中,他们生产了大约2300个SingleTableEntityPersisters实例。每个 SingleTableEntityPersister 使用不同的标识符生成大约 15 个 SQL 查询。Hibernate被迫生成大约345.000个不同的SQL查询。一切都很好,没有什么奇怪的:)