Я пытаюсь выполнить следующую инструкцию SQL каждый раз, когда обновляется сеанс базы данных.У меня есть Spring Boot 2.0.1.RELEASE с приложением JPA и базой данных PostgreSQL.
select set_config('SOME KEY', 'SOME VALUE', false);
Поскольку документация PostgreSQL утверждает, что параметр is_local используется дляуказать, что это значение конфигурации будет применяться только для текущей транзакции - , если true - или будет присоединено к сеансу (как мне требуется) - , если false -
Проблема в том, что я не знаю, когда Hibernate / Hikari обновляют сессию db, поэтому на практике приложение перестает работать, когда оно работает несколько минут, как вы можете себе представить ...
Мой подход - , который еще не работает - заключается в реализации EmptyInterceptor, для этого я добавил класс DatabaseCustomizer для правильного внедрения моего hibernate.session_factory.interceptor таким образом, что Spring можетзаполните все мои @ Autowires
DatabaseInterceptor.class
@Component
public class DatabaseInterceptor extends EmptyInterceptor {
@Autowired
private ApplicationContext context;
@Override
public void afterTransactionBegin(Transaction tx) {
PersistenceService pc = context.getBean(PersistenceService.class);
try {
pc.addPostgresConfig("SOME KEY", "SOME VALUE");
System.out.println("Config added...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
DatabaseCustomizer.class
@Component
public class DatabaseCustomizer implements HibernatePropertiesCustomizer {
@Autowired
private DatabaseInterceptor databaseInterceptor;
@Override
public void customize(Map<String, Object> hibernateProperties) {
hibernateProperties.put("hibernate.session_factory.interceptor", databaseInterceptor);
}
}
Очевидно, есть проблема с этим приложениемпотому что когда я @Override метода afterTransactionBegin для запуска другой транзакции, я получаю бесконечный цикл.
Я пытался заглянуть внутрь этой Transaction tx , которая может помочьбудьте уверены, что эта транзакция не генерируется моим собственным addPostgresConfig , но на нем мало информации.
Есть ли что-то еще, что я мог бы попытаться достичь?
Заранее спасибо,