Я только что протестировал свое приложение под профилировщиком и обнаружил, что строки sql используют около 30% моей памяти! Это странно.
В памяти приложения хранится много подобных строк. Это SQL-запросы, сгенерированные Hibernate, обратите внимание на различные цифры и последние подчеркивания:
select avatardata0_.Id as Id4305_0_,...... where avatardata0_.Id=? for update
select avatardata0_.Id as Id4347_0_,...... where avatardata0_.Id=? for update
Вот часть, которую я не могу понять. Почему hibernate должен генерировать разные строки sql с разными идентификаторами, такими как " Id4305_0_ " для каждого запроса? Почему он не может использовать одну строку запроса для всех идентичных запросов? Это какой-то трюк, чтобы обойти кеширование запросов?
Буду очень признателен, если кто-нибудь опишет, почему это происходит и как избежать такой потери ресурсов.
UPDATE
Ok. Я нашел это. Я ошибался, предполагая утечку памяти, это была моя вина Hibernate работает как задумано.
Мое приложение создало 121 (!) SessionFactories в 10 потоках, они произвели около 2300 экземпляров SingleTableEntityPersisters. И каждый SingleTableEntityPersister генерирует около 15 SQL-запросов с разными идентификаторами. Hibernate был вынужден генерировать около 345 000 различных запросов SQL. Все хорошо, ничего странного:)