Hibernate (/ JPA) подкачки на стороне сервера и MS SQL Server - PullRequest
7 голосов
/ 26 марта 2012

Я реализую серверную подкачку данных с hibernate / JPA, базовой базой данных является MS SQL Server 2008.

SQL генерируется так:

criteria.setFirstResult(pagingParams.getDisplayStart())
.setMaxResults(pagingParams.getDisplayLength());

(Основная работа заключается в создании соответствующего фильтра / сортировки, но здесь это не актуально)

Я наблюдаю следующий SQL:

page (0-20):
select top 20 this_.id as id11_9_,...

page (20-40):
select top 40 this_.id as id11_9_,... 

page (40-60):
select top 60 this_.id as id11_9_,... 

... и так далее.

Очевидно, что это (a) столкнется с серьезными проблемами, если базовый набор результатов станет слишком большим и (b) не имеет ничего общего с подкачкой: - (

Любой, кто имелта же проблема?

Обновление : похоже, что NHibernate (реализация Hibernate .NET) использует функции Row_Number() T-SQL.что Hibernate не ...

Ответы [ 3 ]

8 голосов
/ 07 февраля 2014

Немного поздний ответ, но он может быть полезен, поэтому я опубликую его.Была та же самая проблема и головная боль, чтобы выследить это.Решением является использование org.hibernate.dialect.SQLServer2012Dialect, включенного в Hibernate 4.3.0.Сгенерированный запрос становится (вставляя настоящий дамп Hibernate без имен столбцов и псевдонимов):

WITH query 
     AS (SELECT inner_query.*, 
                Row_number() 
                  OVER ( 
                    ORDER BY CURRENT_TIMESTAMP) AS __hibernate_row_nr__ 
         FROM   (SELECT TOP(?) <COLUMN_NAMES> AS <ALIASES>
FROM <TABLE_NAME>
) inner_query) 
SELECT <ALIASES>
FROM   query 
WHERE  __hibernate_row_nr__ >= ? 
       AND __hibernate_row_nr__ < ?

Обратите внимание на использование внутреннего запроса и функции Row_number()Они наконец решили это!

4 голосов
/ 01 мая 2012

Мы также наблюдали такое же поведение с Hibernate 3.3 с hibernate.dialect=org.hibernate.dialect.SQLServerDialect (с SQL Server 2008 R2).

У меня сложилось впечатление, что эта проблема с производительностью исчезает при использовании комбинации Hibernate> = 3.5, настройкаhibernate.dialect до org.hibernate.dialect.SQLServer2005Dialect или org.hibernate.dialect.SQLServer2008Dialect, с использованием SQL Server> = 2005 и, возможно, также JDBC драйвера SQL Server> = 3.0.

Дополнительные ссылки наСоздайте резервную копию приведенного выше впечатления:

2 голосов
/ 18 марта 2013

Это связано с тем, что для этой версии MSSQL не предусмотрена реальная реализация подкачки. На самом деле есть возможность использовать внутренний запрос с Row_Number (), но, как вы упомянули, Hibernate не использует это.

Я обнаружил, что некоторые люди изменили SQLServer2008Dialect.java, чтобы он использовал Row_Number (). перейдите по этой ссылке

РЕДАКТИРОВАТЬ: (Я заметил, что источник этих файлов больше не доступны)

В MSSQL2012 эта проблема должна быть решена, потому что они реализовали функции подкачки. Единственная проблема заключается в том, что для этой версии MSSQL нет определенного диалекта. Они предлагают использовать старый (MSSQL2008), но это приведет к тем же проблемам с подкачкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...