2015-02-03 17 views
12

Ho una domanda sul contesto config nella Tomcat 8. I migrazione progetto dal Tomcat 7-8 e hanno problema insolito: se il cambiamento non in config ho preso un errore:Migrazione a Tomcat 8: InstanceAlreadyExistsException datasource

"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.BasicDataS[email protected]] 
    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 del contesto:

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

Quindi, è lavori in Tomcat 7 senza alcun problema. In Tomcat 8 posso risolvere questo problema in 2 modi:

  1. Aggiungendo a risorsa: singleton = "false";
  2. Aggiungendo a risorsa: factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

Se ho capito chiaramente Tomcat crea origine dati per la mia app e per jmx, ma in Tomcat 7 era un singolo oggetto, in Tomcat 8 doveva essere diverso. Quindi la mia domanda è: perché questa situazione è accaduta? Non sono riuscito a trovare alcuna informazione su questo cambiamento nella documentazione. E sono interessante ciò che è meglio: creare un'unica origine dati (penso di sì) o crearne diversi in fabbrica.

+0

Quali sono le versioni tomcat 7 (da) e tomcat 8 (a)? Puoi anche aggiungere il tuo web.xml? La tua applicazione utilizza la dichiarazione sopra menzionata nel suo proprio file context.xml (META-INF)? In caso affermativo, puoi pubblicare questo? Btw quando si usa una risorsa JDBC, singleton deve essere "true" – swinkler

risposta

6

ho avuto lo stesso errore e risolto con l'aggiunta di registrazione = "ignoreExisting" alla parte MBean-export:

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

abbiamo avuto lo stesso problema. Abbiamo dichiarato la nostra fonte di dati come un fagiolo di primavera, e sembra che sia la primavera che il bean stesso tentano di registrarsi e Mbean che porta a questo conflitto. Tutto ciò che dovevamo fare è configurare il nostro Mbean esportatore in questo modo:

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

anche se suppongo impostare la politica di registrazione a:

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); 

potrebbe anche funzionare.

0

Se si desidera che la soluzione utilizzando le annotazioni avvio Primavera definisce già MBeanExporter fagioli in modo da poter auto-wire su di esso

@Autowired 
MBeanExporter mBeanExporter ; 

quindi modificare la politica di registrazione

mBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); 
Problemi correlati