spring/tomcat-jdbc pool - новый слушатель соединения
Я использую tomcat-jdbc
пул по умолчанию spring-boot
настроить. Я хотел бы запускать некоторый пользовательский код Java каждый раз, когда новое соединение JDBC устанавливается в пуле и до того, как оно используется в первый раз. Как это сделать, и если есть несколько возможностей, какая из них лучше?
2 ответа
Ну, я могу придумать два варианта:
Создайте свой собственный класс-обертку, либо расширив Tomcat
DataSource
класс или путем реализации JavaDataSource
интерфейс и делегирование на завернутыйDataSource
- а затем добавьте нужную логику к желаемым методам и зарегистрируйте бин в@Configuration
класс, вручную создавая ваш экземплярtomcat-jdbc
DataSource
(для примеров того, как это сделать, обратитесь к классу DataSourceConfiguration.Tomcat) и оберните его своим классом.Создайте аспект и используйте поддержку Spring AOP для перехвата вызовов
getConnection
, посколькуDataSource
класс находится в пакете javax, я думаю, вам придется использовать AspectJ, и для некоторых примеров обратитесь к этой ссылке
Мое предложение было бы пойти с первым вариантом, он должен дать вам меньше головной боли, вот небольшой пример того, как вы определили бы ваш 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, если вы используете pointcut как этот:
@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection())")
public void afterConnectionEstablished() {
...
}