Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Migration to Tomcat 8: InstanceAlreadyExistsException datasource

I have a question about context config in Tomcat 8. I migrating project from Tomcat 7 to 8 and have unusual problem: if nothing change in config I caught an error:

    "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" 

Part of context:

<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"/> 

So, it's works in tomcat 7 without any problem. In Tomcat 8 I can solve this problem in 2 ways:

  1. By adding to resource: singleton = "false";
  2. By adding to resource: factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

If I clearly understand tomcat creates datasource for my app and for jmx, but in Tomcat 7 it was single object, in Tomcat 8 it must be different. So my question is why that situation has happened? I couldn't find any information of this change in documentation. And I'm interesting what is better: create single datasource (I think so) or create several by factory.

like image 228
Vadim R Avatar asked Feb 03 '15 09:02

Vadim R


2 Answers

We had the same problem. We declared our data source as a spring bean, and it looks like both spring and the bean itself try to register an Mbean which leads to this conflict. All we had to do is configure our Mbean Exporter like this:

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

Although I suppose setting the registration policy to:

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); 

might also work.

like image 122
Radi Radichev Avatar answered Oct 10 '22 16:10

Radi Radichev


I had the same error and resolved it by adding registration="ignoreExisting" to the mbean-export part:

<context:mbean-export server="mbeanServer" default-domain="mydomain" registration="ignoreExisting" /> 
like image 36
Andreas Avatar answered Oct 10 '22 14:10

Andreas