spring / tomcat-jdbc pool - 新的连接侦听器

时间:2016-07-22 12:11:40

标签: spring jdbc spring-boot connection-pooling tomcat-jdbc

我在默认tomcat-jdbc设置中使用spring-boot池。我希望每次在池中建立新的JDBC连接时以及第一次使用它之前运行一些自定义Java代码。怎么做,如果有几种可能性最好?

2 个答案:

答案 0 :(得分:3)

要扩展已经接受的答案,如果您使用切入点,则可以使用Spring AOP 而不使用完整的AspectJ

@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection())")
public void afterConnectionEstablished() {
    ...
}

答案 1 :(得分:2)

嗯,我可以想到两个选择:

  1. 创建自己的包装器类 - 通过扩展Tomcat的DataSource类或实现Java的DataSource接口并委派给包装的DataSource - 然后添加您想要的逻辑通过手动实例化@Configuration tomcat-jdbc(有关如何执行此操作的示例,请参阅DataSourceConfiguration.Tomcat class)并将其包装到期望的方法并在DataSource类中注册bean与你的班级。

  2. 创建一个方面并使用Spring的AOP支持来拦截对getConnection的调用。由于DataSource类在javax包中,我认为你必须使用AspectJ,而对于一些例子,请参考this link

  3. 我的建议是使用第一个选项,它应该会减少你的麻烦,这里有一个小例子来定义你的包装bean:

    @Bean
    public DataSource dataSource(DataSourceProperties properties) {
        return new MyDataSourceWrapper(tomcatDataSourceFrom(properties));
    }
    
    private org.apache.tomcat.jdbc.pool.DataSource tomcatDataSourceFrom(
        DataSourceProperties properties) {
        // manual instantiation like in DataSourceConfiguration.Tomcat class
    }