【发布时间】:2016-11-26 08:07:46
【问题描述】:
我在默认spring-boot 设置中使用tomcat-jdbc 池。每次在池中建立新的 JDBC 连接时以及第一次使用它之前,我都想运行一些自定义 Java 代码。怎么做,如果有几种可能性,哪一种是最好的?
【问题讨论】:
标签: spring jdbc spring-boot connection-pooling tomcat-jdbc
我在默认spring-boot 设置中使用tomcat-jdbc 池。每次在池中建立新的 JDBC 连接时以及第一次使用它之前,我都想运行一些自定义 Java 代码。怎么做,如果有几种可能性,哪一种是最好的?
【问题讨论】:
标签: spring jdbc spring-boot connection-pooling tomcat-jdbc
要扩展已经接受的答案,如果你使用切入点作为这个,你可以使用 Spring AOP 没有完整的 AspectJ:
@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection())")
public void afterConnectionEstablished() {
...
}
【讨论】:
嗯,我可以想到两个选择:
创建您自己的包装类 - 通过扩展 Tomcat 的 DataSource 类或通过实现 Java 的 DataSource 接口并委托给包装的 DataSource - 然后将您想要的逻辑添加到所需的方法并注册通过手动实例化 tomcat-jdbc DataSource(有关如何执行此操作的示例,请参阅 DataSourceConfiguration.Tomcat class)并将其包装在您的类中,可以在 @Configuration 类中创建一个 bean。
创建一个切面并使用 Spring 的 AOP 支持来拦截对 getConnection 的调用。由于DataSourceclass 在 javax 包中,我认为您必须使用 AspectJ,有关示例请参阅 this link
我的建议是使用第一个选项,它应该可以减少你的麻烦,这里有一个小例子,你将如何定义你的 wrapper 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
}
【讨论】: