Tomcat 8への移行: InstanceAlreadyExistsExceptionデータソース 質問する

Tomcat 8への移行: InstanceAlreadyExistsExceptionデータソース 質問する

Tomcat 8 のコンテキスト設定について質問があります。プロジェクトを Tomcat 7 から 8 に移行しているのですが、異常な問題が発生しています。設定に何も変更がない場合、エラーが発生しました。

    "2015-02-03 12:05:48,310 FIRST_ADMIN ERROR web.context.ContextLoader:331 
-> Context initialization failed org.springframework.jmx.export.UnableToRegisterMBeanException: 
    Unable to register MBean [org.apache.tomcat.dbcp.dbcp2.BasicDataSource@434990dd]
     with key 'dataSource'; nested exception is 
    javax.management.InstanceAlreadyExistsException:  
    Catalina:type=DataSource,host=localhost,context=/first-
    admin,class=javax.sql.DataSource,name="jdbc/datasource/first"

コンテキストの一部:

<Resource name="jdbc/datasource/first"
              auth="Container"
              type="javax.sql.DataSource"
              poolPreparedStatements="true"
              initialSize="25"
              maxActive="100"
              maxIdle="100"
              minIdle="25"
              username="us"
              password="pa"
              driverClassName="com.mysql.jdbc.Driver"
              validationQuery="select 1"
              testOnBorrow="true"
          url="jdbc:mysql://localhost:3306/firstproject?useUnicode=true&amp;characterEncoding=UTF-8&amp;profileSQL=false&amp;autoSlowLog=false&amp;slowQueryThresholdMillis=100&amp;autoReconnect=true"/>

したがって、Tomcat 7 では問題なく動作します。Tomcat 8 では、この問題を 2 つの方法で解決できます。

  1. リソースに追加することで:singleton = "false";
  2. リソースに追加することで:factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

Tomcat がアプリと jmx のデータソースを作成するのは理解していますが、Tomcat 7 では単一のオブジェクトでしたが、Tomcat 8 では異なるはずです。そこで私の質問は、なぜこのような状況になったのかということです。ドキュメントでこの変更に関する情報を見つけることができませんでした。また、単一のデータソースを作成する (そうだと思います) か、ファクトリで複数のデータソースを作成するか、どちらがよいのか興味があります。

ベストアンサー1

私たちも同じ問題を抱えていました。データ ソースを Spring Bean として宣言しましたが、Spring と Bean 自体の両方が Mbean を登録しようとして、この競合が発生しているようです。必要なのは、Mbean エクスポーターを次のように構成することだけです。

@Bean
public AnnotationMBeanExporter annotationMBeanExporter() {
    AnnotationMBeanExporter annotationMBeanExporter = new AnnotationMBeanExporter();
    annotationMBeanExporter.addExcludedBean("dataSource");
    return annotationMBeanExporter;
}

ただし、登録ポリシーを次のように設定するとします。

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);

も機能するかもしれません。

おすすめ記事