每次刷新数据库会话时,我都会尝试执行以下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 生成的,但是它上面没有太多内容
还有什么我可以尝试实现这个目标吗?
提前致谢,