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&characterEncoding=UTF-8&profileSQL=false&autoSlowLog=false&slowQueryThresholdMillis=100&autoReconnect=true"/>
Por lo tanto, funciona en Tomcat 7 sin ningún problema. En Tomcat 8 puedo resolver este problema de 2 maneras:
- Añadiendo al recurso:
singleton = "false";
- 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.