检测数据库会话何时在Spring Boot 2应用程序上刷新

时间:2018-05-18 18:51:37

标签: postgresql hibernate spring-boot jpa

每次刷新数据库会话时,我都会尝试执行以下SQL语句。我有一个带有JPA应用程序和PostgreSQL数据库的Spring Boot 2.0.1.RELEASE。

select set_config('SOME KEY', 'SOME VALUE', false);

正如PostgreSQL documentation所述, is_local 参数用于指示此配置值仅适用于当前事务 - 如果为true - 或将附加到会话(根据我的要求) - 如果错误 -

问题是我不知道Hibernate / Hikari什么时候刷新数据库会话,所以,实际上,应用程序在运行几分钟后就开始失败,你可以想象......

我的方法 - 还没有工作 - 是实现一个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 生成的,但是它上面没有太多内容

还有什么我可以尝试实现这个目标吗?

提前致谢,

0 个答案:

没有答案