我有一个像往常一样使用 hikari 池的 Spring Boot 应用程序。
我需要在每个http请求之前执行一个pl/sql过程。此连接会与请求的上下文一起使用吗?
我正在努力查看它是否相同或者是池中的另一个连接。
我尝试过使用 jpa 拦截器,但无法使其工作。
您可以尝试将“在视图中打开会话”方法与自定义拦截器结合起来,但将其顺序设置为最低的,以便 Spring 在过程调用之前打开事务。
步骤如下:
激活视图中打开的会话,在
application.yaml
中设置此属性:
spring:
jpa:
open-in-view: true
实现一个拦截器,在preHandle方法中调用db过程;因为它是一个
@Component
,所以您可以用 @Transactional
注释它并注入其他 Bean(即服务或存储库)以进行数据库过程调用:
@Component
@Transactional
public class OsivProcedureInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// Your db procedure call here...
return true;
}
}
实现一个配置类,告诉 Spring 您有这个自定义拦截器,并且您希望它在其他拦截器之后执行(即在严格连接到您之前设置的属性的
OpenEntityManagerInViewInterceptor
之后):
@Configuration
public class OsivWebConfiguration implements WebMvcConfigurer {
@Autowired OsivProcedureInterceptor osivProcedureInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(osivProcedureInterceptor).order(Ordered.LOWEST_PRECEDENCE);
}
}
执行此操作,您将看到
EntityManager
在自定义拦截器之前打开,并且事务将持续到控制器完成响应构建。