tomcat-jdbc
デフォルト設定でプールを使用していspring-boot
ます。プールで新しい JDBC 接続が確立されるたびに、それが初めて使用される前に、いくつかのカスタム Java コードを実行したいと考えています。それを行う方法と、いくつかの可能性がある場合、どれが最適ですか?
2 に答える
すでに受け入れられている回答を拡張するには、次のようにポイントカットを使用する場合、完全な AspectJ なしでSpring AOP を使用できます。
@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection())")
public void afterConnectionEstablished() {
...
}
さて、私は2つのオプションを考えることができます:
Tomcat の
DataSource
クラスを拡張するか、Java のDataSource
インターフェイスを実装してラップされたものに委譲することにより、独自のラッパー クラスを作成DataSource
し、目的のメソッドに必要なロジックを追加し、Bean を@Configuration
手動でインスタンス化してクラスに登録しますtomcat-jdbc
DataSource
(方法の例については、そうするには、DataSourceConfiguration.Tomcat クラスを参照してください)、それをクラスでラップします。アスペクトを作成し、Spring の AOP サポートを使用して への呼び出しをインターセプトします
getConnection
。クラスは javax パッケージに含まれているためDataSource
、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
}