2015-02-03 31 views
12

Mam pytanie odnośnie konfiguracji kontekstu w Tomcat 8. I migrowania projektu z Tomcat 7 do 8 i mają nietypowy problem: jeśli zmiana nic w config złapałem błąd:Migracja do 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 [[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" 

Część z kontekstu:

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

Tak, to prace w Tomcat 7 bez żadnego problemu. W Tomcat 8 mogę rozwiązać ten problem na 2 sposoby:

  1. Dodając do zasobu: singleton = "false";
  2. Dodając do zasobu: factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

Gdybym jasno zrozumieć tomcat tworzy źródło danych dla mojej aplikacji i dla jmx, ale w Tomcat 7 był to pojedynczy obiekt, w Tomcat 8 musi być inny. Moje pytanie brzmi: dlaczego taka sytuacja się wydarzyła? Nie mogłem znaleźć żadnych informacji o tej zmianie w dokumentacji. I jestem interesujący, co jest lepsze: utwórz pojedyncze źródło danych (tak mi się wydaje) lub utwórz kilka fabrycznie.

+0

Jakie są wersje tomcat 7 (z) i tomcat 8 (to)? Czy możesz również dodać swój web.xml? Czy twoja aplikacja używa powyższej deklaracji w swoim pliku context.xml (META-INF) - jeśli tak, możesz to opublikować? Btw przy użyciu zasobu JDBC, singleton musi być "prawdziwy" – swinkler

Odpowiedz

6

Miałem ten sam błąd i postanowił go dodając rejestracyjny = "ignoreExisting" do części MBean-eksport:

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

Mieliśmy ten sam problem. Zadeklarowaliśmy nasze źródło danych jako komponent sprężynowy i wygląda na to, że zarówno wiosna, jak i sam komponent bean starają się zarejestrować i Mbean, co prowadzi do tego konfliktu. Wszystko co musieliśmy zrobić, to skonfigurować naszą MBean Exporter tak:

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

Chociaż Przypuszczam ustalaniu polityki rejestracyjny:

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); 

może również pracować.

0

Jeśli chcesz roztwór przy użyciu adnotacji Wiosna rozruchu już definiuje MBeanExporter fasoli, dzięki czemu można auto-wire na nim

@Autowired 
MBeanExporter mBeanExporter ; 

Następnie zmienić politykę rejestracji

mBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);