拦截器中的@Transactional是否发出使用相同hikari池连接的请求?

问题描述 投票:0回答:1

我有一个像往常一样使用 hikari 池的 Spring Boot 应用程序。

我需要在每个http请求之前执行一个pl/sql过程。此连接会与请求的上下文一起使用吗?

我正在努力查看它是否相同或者是池中的另一个连接。

我尝试过使用 jpa 拦截器,但无法使其工作。

spring-boot jdbctemplate hikaricp
1个回答
0
投票

您可以尝试将“在视图中打开会话”方法与自定义拦截器结合起来,但将其顺序设置为最低的,以便 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
在自定义拦截器之前打开,并且事务将持续到控制器完成响应构建。

© www.soinside.com 2019 - 2024. All rights reserved.