我刚刚在分析器下测试了我的应用程序,发现sql字符串使用了大约30%的内存!真奇怪
此类字符串存储在应用程序内存中。这是由 hibernate 生成的SQL查询,请注意不同的数字和结尾的下划线:
select avatardata0_.Id as Id4305_0_,...... where avatardata0_.Id=? for update
select avatardata0_.Id as Id4347_0_,...... where avatardata0_.Id=? for update
这是我无法理解的部分。为何 hibernate 模式必须为每个查询生成具有不同标识符(例如“ Id4305_0_ ”)的不同sql字符串?为什么所有相同查询都不能使用一个查询字符串?这是绕过查询缓存的一种技巧吗?
如果有人能描述我为什么会发生以及如何避免这种资源浪费,我将不胜感激。
更新
行。我找到了。假设内存泄漏,我错了,这是我的错。 Hibernate正在按预期工作。
我的应用程序在10个线程中创建了121(!)个SessionFactories,它们产生了大约2300个SingleTableEntityPersisters实例。每个SingleTableEntityPersister会生成大约15个具有不同标识符的SQL查询。 Hibernate被迫生成大约345.000个不同的SQL查询。一切都很好,没有什么奇怪的:)
最佳答案
hibernate 生成的查询字符串背后有一个逻辑。其主要目的是获得表和列名称的唯一别名。
根据您的查询,select avatardata0_.Id as Id4305_0_,...... where avatardata0_.Id=?
因此,这样可以避免所有可能的冲突。
您正在查看这些查询,因为您已打开show_sql
标志配置。 这用于调试查询。一旦应用程序开始工作,就应该将其关闭。
阅读有关API文档here的更多信息。
我不太了解内存消耗部分,但是您在关闭上述标志的情况下重复了测试,看看是否有任何改进。