web-dev-qa-db-ja.com

Tomcat 8への移行:InstanceAlreadyExistsExceptionデータソース

Tomcat 8のコンテキスト構成について質問があります。Tomcat7から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では異なる必要があります。だから私の質問は、なぜそのような状況が起こったのですか?ドキュメントにこの変更の情報が見つかりませんでした。そして、私は興味深いのですが、単一のデータソースを作成する(そう思う)か、工場で複数のデータソースを作成します。

25
Vadim R

同じ問題がありました。データソースをSpring Beanとして宣言しましたが、SpringとBeanの両方がMBeanを登録しようとしているため、この競合が発生しています。 Mbean Exporterを次のように構成するだけです。

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

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

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);

うまくいくかもしれません。

12
Radi Radichev

同じエラーが発生し、mbean-export部分にregistration = "ignoreExisting"を追加して解決しました。

<context:mbean-export server="mbeanServer" default-domain="mydomain" registration="ignoreExisting" />
10
Andreas

アノテーションを使用したソリューションが必要な場合は、SpringブートですでにMBeanExporter Beanが定義されているため、自動でワイヤリングできます。

@Autowired
MBeanExporter mBeanExporter ;

次に、登録ポリシーを変更します

mBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);
5
Hazemdido

誰かがapplicationContext.xmlスタイルを使用している場合、私はこのように問題を解決しました:

<bean id="myNamedExporter" class="org.springframework.jmx.export.MBeanExporter">
    <property name="registrationPolicy" value="IGNORE_EXISTING" />
</bean>
1
brightmatter