2015-02-03 5 views
12

ich eine Frage über Kontext config in Tomcat haben 8. Ich Projekt von Tomcat 7 bis 8 Migration und haben ungewöhnliches Problem: wenn nichts ändern in Config ich einen Fehler gefangen:Migration zu Tomcat 8: InstanceAlreadyExistsException Datenquelle

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

Teil des Kontextes:

<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 ist es Werke in tomcat 7 ohne Probleme. In Tomcat 8 ich dieses Problem in zwei Weisen lösen kann:

  1. Ressourcen Durch Zugabe: singleton = "false";
  2. Durch das Hinzufügen von Ressourcen: factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

Wenn ich tomcat schafft Datenquelle für meine Anwendung klar zu verstehen und für jmx, aber in Tomcat 7 war es ein einzelnes Objekt, in Tomcat 8 muss es anders sein. Also meine Frage ist, warum diese Situation passiert ist? Ich konnte keine Informationen über diese Änderung in der Dokumentation finden. Und ich bin interessant, was besser ist: Erstellen Sie einzelne Datenquelle (ich denke schon) oder erstellen Sie mehrere von Factory.

+0

Was sind die Versionen Kater 7 (von) und Kater 8 (bis)? Können Sie auch Ihre web.xml hinzufügen? Verwendet Ihre Anwendung die oben genannte Deklaration in ihrer eigenen context.xml-Datei (META-INF) - wenn ja, können Sie dies posten? Bei Verwendung einer JDBC-Ressource muss Singleton "True" sein. – swinkler

Antwort

6

hatte ich die gleichen Fehler und gelöst es Anmeldung = "ignoreExisting" zum mbean-Export Teil durch Zugabe von:

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

Wir hatten das gleiche Problem. Wir haben unsere Datenquelle als eine Frühlingsbohne deklariert, und es sieht so aus, als ob sowohl der Frühling als auch die Bohne sich registrieren und Mbean, was zu diesem Konflikt führt. Alles, was wir tun mussten, ist unser Mbean Exporteur wie folgt konfiguriert werden:

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

Obwohl ich die Registrierungspolitik nehme Einstellung:

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); 

könnte auch funktionieren.

0

Wenn Sie die Lösung wollen, mit Anmerkungen Frühling Boot definiert bereits MBeanExporter Bohne so können Sie Auto-Draht auf sie

@Autowired 
MBeanExporter mBeanExporter ; 

dann die Politik Registrierung ändern

mBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); 
Verwandte Themen