У нас есть веб-приложение, работающее в производственной среде, и в какой-то момент клиент пожаловался на то, насколько медленно оно работает.
Когда мы проверили, что происходит с приложением и базой данных, мы обнаружили этот «драгоценный» запрос, который выполнялся несколькими пользователями одновременно (таким образом, создавая чрезвычайно высокую нагрузку на сервер базы данных):
SELECT NULL AS table_cat,
o.owner AS table_schem,
o.object_name AS table_name,
o.object_type AS table_type,
NULL AS remarks
FROM all_objects o
WHERE o.owner LIKE :1 ESCAPE :"SYS_B_0" AND
o.object_name LIKE :2 ESCAPE :"SYS_B_1" AND
o.object_type IN(:"SYS_B_2", :"SYS_B_3")
ORDER BY table_type, table_schem, table_name
Наше приложение не выполняет этот запрос, я считаю, что это внутренний запрос Hibernate. Я нашел мало информации о том, почему Hibernate делает этот чрезвычайно тяжелый запрос, поэтому любая помощь в том, как его избежать, очень ценится!
Информация об окружающей среде: Red Hat Enterprise Linux 5.3 (Tikanga), JDK 1.5, веб-контейнер OC4J (с сервером приложений Oracle), Oracle Database 10.1.0.4, драйвер JDBC для JDK 1.2 и 1.3, Hibernate версия 3.2.6. ga, библиотека пула соединений C3P0 версия 0.9.1.
ОБНОВЛЕНИЕ : Спасибо @BalusC за разъяснение того, что действительно Hibernate выполняет запрос, теперь у меня есть лучшее представление о том, что происходит. Я объясню, как мы справляемся с Hibernate-сессией (это очень элементарно, да, если у вас есть предложения о том, как справиться с этим лучше, они более чем приветствуются!)
У нас есть фильтр (реализующий javax.servlet.Filter), который при запуске (метод init) создает фабрику сессий (возможно, это происходит только один раз). Затем каждый запрос HttpRequest, который поступает в приложение, проходит через фильтр, получает новый сеанс и запускает транзакцию. Когда процесс завершен, он возвращается через фильтр, делает фиксацию транзакции, убивает сеанс гибернации, затем переходит на страницу пересылки (мы не сохраняем сеанс гибернации в сеансе Http потому что он никогда не работал хорошо в наших тестах).
Теперь наступает момент, когда я думаю, что проблема в этом. В нашей среде разработки мы разворачиваем наши приложения в Tomcat 5.5, и при запуске службы все фильтры запускаются сразу и только один раз . В производственной среде с OC4J, похоже, не работает таким образом. Мы разворачиваем приложение и только при поступлении первого запроса OC4J создает фильтры.
Это наводит меня на мысль, что OC4J создает фильтры для каждого запроса (или, по крайней мере, несколько раз, что все еще неправильно), создавая таким образом фабрику сеансов для каждого запроса, который выполняет этот% &% #% $ # запрос, который приводит к моей проблеме!
Теперь это правильно? У меня есть способ настроить OC4J, чтобы он создавал фильтры только один раз?
Большое спасибо всем, что нашли время ответить на это!