spring/tomcat-jdbc 池 - 新的连接侦听器
spring/tomcat-jdbc pool - new connection listener
我在默认 spring-boot
设置中使用 tomcat-jdbc
池。每次在池中建立新的 JDBC 连接时以及首次使用之前,我都想 运行 一些自定义 Java 代码。怎么做,如果有几种可能性,那一种最好?
嗯,我可以想到两个选择:
创建您自己的包装器 class - 通过扩展 Tomcat 的 DataSource
class 或实现 Java 的DataSource
接口并委托给包装的 DataSource
- 然后将您想要的逻辑添加到所需的方法中,并通过手动实例化 [=] 在 @Configuration
class 中注册一个 bean 15=] DataSource
(有关如何操作的示例,请参阅 DataSourceConfiguration.Tomcat class)并用您的 class.
包装它
创建方面并使用 Spring 的 AOP 支持拦截对 getConnection
的调用。由于 DataSource
class 在 javax 包中,我认为你必须使用 AspectJ,一些示例请参考 this link
我的建议是选择第一个选项,它应该不会让您头疼,下面是一个如何定义包装器 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
}
要扩展已经接受的答案,如果您使用切入点,则可以使用 Spring AOP 没有完整的 AspectJ:
@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection())")
public void afterConnectionEstablished() {
...
}
我在默认 spring-boot
设置中使用 tomcat-jdbc
池。每次在池中建立新的 JDBC 连接时以及首次使用之前,我都想 运行 一些自定义 Java 代码。怎么做,如果有几种可能性,那一种最好?
嗯,我可以想到两个选择:
创建您自己的包装器 class - 通过扩展 Tomcat 的
DataSource
class 或实现 Java 的DataSource
接口并委托给包装的DataSource
- 然后将您想要的逻辑添加到所需的方法中,并通过手动实例化 [=] 在@Configuration
class 中注册一个 bean 15=]DataSource
(有关如何操作的示例,请参阅 DataSourceConfiguration.Tomcat class)并用您的 class. 包装它
创建方面并使用 Spring 的 AOP 支持拦截对
getConnection
的调用。由于DataSource
class 在 javax 包中,我认为你必须使用 AspectJ,一些示例请参考 this link
我的建议是选择第一个选项,它应该不会让您头疼,下面是一个如何定义包装器 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
}
要扩展已经接受的答案,如果您使用切入点,则可以使用 Spring AOP 没有完整的 AspectJ:
@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection())")
public void afterConnectionEstablished() {
...
}