Обнаружение обновления сеанса базы данных в приложении Spring Boot 2 - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь выполнить следующую инструкцию 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 , но на нем мало информации.

Есть ли что-то еще, что я мог бы попытаться достичь?

Заранее спасибо,

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