Я знаю, что этот поток старый, но для обновления я столкнулся с той же проблемой, но с SQL Server, и оказалось, что SQL, печатаемый с помощью Hibernate и SQL Sent с использованием драйвера, отличается.При использовании драйвера MSSQL по умолчанию запросы отправляются как хранимые процедуры, так как вызовы RPC вызваны тем, что драйвер пытается оптимизировать план запросов для стандартов MSSQL, поэтому он отправляет запросы примерно так:
Запрос Hibernate:
select c.col1,c.col2 from customer c where c.name like @param1 and c.country like @param2
Фактический драйвер отправил запрос:
@param1=somevalue, @param2=somevalue
declar sp ....
select c.col1,c.col2 from customer c where c.name like @param1 and c.country like @param2
go
Примечание. Этот запрос я получил через инструмент SQL Profiler Tool, непосредственно прослушивающий DB
Оказывается, что оптимизация sp_exec на MSSQL приводит к созданию хороших планов запросов, которые кэшируются, но это приведет к «анализу параметров», чтобы узнать больше об этой проблеме, читайте здесь ...
Чтобы преодолеть это, у меня были следующие опции:
Измените мой HQL на собственные запросы и добавьте OPTION RECOMPILE FOR SOME PARAM
Use Directзначения запроса вместо подготовленных операторов, поэтому не будет никакого перевода значений параметров, и запросы не будут изменены драйвером как хранимые процедуры
Изменить tНастройки драйвера не отправляют хранимые процедуры (это все еще плохо, потому что теперь планы запросов на MSSQL-сервере будут специфичны для этого запроса, это то же самое, что Option: 2, но вне кода)
Я не хотел использовать ВАРИАНТЫ 1 и 2, так как это исключает всю цель использования ORM Frameworks, и я заканчиваю тем, что на данный момент использую ВАРИАНТ 3
Поэтому я изменил URL-адрес JDBC для отправки опции prepareStatement =false
После установки этой проблемы у меня возникла еще одна проблема, связанная с отправкой запроса, например
Select * from customer c where c.name like **N**'somename' and c.country=**N**'somevalue'
Здесь перед значениями стоит префикс, указывающий, что преобразовать схему кодирования, поэтому я отключаюURL JDBC для sendUnicode = false
Это все, что я сделал в настройках драйвера JTDS. Насколько я понимаю, теперь приложение работает и работает быстро.Я также ввел кеш второго уровня для его кеширования в течение некоторого времени.
Надеюсь, это кому-нибудь поможет, если у вас есть хорошие предложения, пожалуйста, дайте мне знать.