Различные результаты выборки из БД в спящем режиме - PullRequest
0 голосов
/ 10 февраля 2020

Получаю разные результаты выборки с запросом SQL vs hql. Использую Spring repo и hibernate, как показано ниже. Но если я запускаю тот же SQL, сгенерированный hibernate, я получаю для ex 5 записей, но мой список customActivationPlans1 содержит 4 записи. Почему есть разница в том же SQL, сгенерированном hibernate и HQL.

Также я замечаю, что это происходит, когда мое левое соединение равно нулю. выборка объединения c .latestRun r выборка слева r.runStatuses s не имеет записей в БД.

@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private PlanRun latestRun;

Список customActivationPlans1 = customPlanRepository.findAllDataSetSelnsAndStatusByTenantId (RequestUtil.getSessionTenant6y)) data 1007 *

1 Ответ

0 голосов
/ 10 февраля 2020

Я бы предложил включить вывод hibernate SQL в конфигурацию вашей регистрации:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

https://www.baeldung.com/sql-logging-spring-boot

Таким образом, вы можете сравнить сгенерированные SQL и посмотрите, есть ли разница в логах c.

Если нет расхождений в логах c, наиболее вероятным объяснением является то, что hibernate кэширует результаты. Это может происходить либо на уровне сеанса, либо в кэше второго уровня: https://www.javacodegeeks.com/2012/02/hibernate-cache-levels-tutorial.html

Также возможно, что изоляция транзакции является фактором. Изоляция транзакции контролирует, как база данных показывает SQL результаты, основанные на изменениях, сделанных в других транзакциях: https://docs.microsoft.com/en-us/sql/odbc/reference/develop-app/transaction-isolation-levels?view=sql-server-ver15

Если вы запрашиваете данные сразу после их сохранения, вам также может понадобиться принудительная гибернация к гриппу sh сеанс: https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#flushing

...