Я только что протестировал свое приложение под профилировщиком и выяснил, что в строках 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
Вот часть, которую я не могу понять. Почему спящий режим должен генерировать разные строки sql с разными идентификаторами типа " Id4305_0 _" для каждого запроса? Почему он не может использовать одну строку запроса для всех одинаковых запросов? Это какой-то трюк, чтобы обойти кеширование запросов?
Я был бы очень признателен, если бы кто-нибудь описал меня, почему это происходит, и как избежать такого истощения ресурсов.
UPDATE
Ok. Я нашел это. Я ошибался, предполагая утечку памяти. Это была моя ошибка. Hibernate работает по назначению.
Мое приложение создало 121 (!) SessionFactories в 10 потоках, они выпустили около 2300 экземпляров SingleTableEntityPersisters. И каждый SingleTableEntityPersister генерирует около 15 SQL-запросов с разными идентификаторами. Hibernate был вынужден генерировать около 345 000 различных SQL-запросов. Все в порядке, ничего странного:)