spring/tomcat-jdbc pool - новый слушатель соединения

Я использую tomcat-jdbc пул по умолчанию spring-boot настроить. Я хотел бы запускать некоторый пользовательский код Java каждый раз, когда новое соединение JDBC устанавливается в пуле и до того, как оно используется в первый раз. Как это сделать, и если есть несколько возможностей, какая из них лучше?

2 ответа

Решение

Ну, я могу придумать два варианта:

  1. Создайте свой собственный класс-обертку, либо расширив Tomcat DataSource класс или путем реализации Java DataSource интерфейс и делегирование на завернутый DataSource - а затем добавьте нужную логику к желаемым методам и зарегистрируйте бин в @Configuration класс, вручную создавая ваш экземпляр tomcat-jdbcDataSource (для примеров того, как это сделать, обратитесь к классу DataSourceConfiguration.Tomcat) и оберните его своим классом.

  2. Создайте аспект и используйте поддержку 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() {
    ...
}
Другие вопросы по тегам