java tomcat configuration context.xml

java - Migración a Tomcat 8: fuente de datos InstanceAlreadyExistsException



configuration context.xml (4)

Si alguien usa el estilo de applicationContext.xml , resolví el problema de esta manera:

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

Tengo una pregunta acerca de la configuración de contexto en Tomcat 8. Migré el proyecto de Tomcat 7 a 8 y tengo un problema inusual: si nada cambia en la configuración, detecté un 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"

Parte de contexto:

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

Por lo tanto, funciona en Tomcat 7 sin ningún problema. En Tomcat 8 puedo resolver este problema de 2 maneras:

  1. Añadiendo al recurso: singleton = "false";
  2. Añadiendo a resource: factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

Si entiendo claramente que Tomcat crea un origen de datos para mi aplicación y para jmx, pero en Tomcat 7 era un objeto único, en Tomcat 8 debe ser diferente. Entonces mi pregunta es ¿por qué ha ocurrido esa situación? No pude encontrar ninguna información de este cambio en la documentación. Y me interesa lo que es mejor: crear una fuente de datos única (creo que sí) o crear varias por fábrica.


Si desea que la solución utilice anotaciones, Spring Boot ya define MBeanExporter bean, por lo que puede realizar un cableado automático en él.

@Autowired MBeanExporter mBeanExporter ;

Luego cambia la política de registro

mBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);


Tuve el mismo error y lo resolví agregando registration = "ignoreExisting" a la parte de mbean-export:

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


Tuvimos el mismo problema. Declaramos nuestra fuente de datos como un bean spring, y parece que tanto spring como el bean en sí intentan registrar un Mbean que lleva a este conflicto. Todo lo que tuvimos que hacer es configurar nuestro exportador de Mbean de esta manera:

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

Aunque supongo que establecer la política de registro para:

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);

También podría funcionar.