2015-02-03 2 views
12

У меня есть вопрос о контексте конфигурации в Tomcat 8. Я мигрирующий проект от Tomcat 7 до 8 и имеет необычную проблему: если изменить ничего в конфигурации я поймал ошибку:Переход к 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" 

Часть контекста:

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

Таким образом, это работает в коте 7 без каких-либо проблем. В Tomcat 8 я могу решить эту проблему в 2-мя способами:

  1. Добавив к ресурсу: singleton = "false";
  2. Добавив к ресурсу: factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

Если я четко понимаю, кот создает источник данных для моего приложения и для jmx, но в Tomcat 7 это был единственный объект, в Tomcat 8 он должен быть другим. Поэтому мой вопрос: почему эта ситуация произошла? Я не мог найти информацию об этом изменении документации. И мне интересно, что лучше: создать одиночный источник данных (я так думаю) или создать несколько по фабрике.

+0

Какие версии tomcat 7 (from) и tomcat 8 (to)? Можете ли вы также добавить свой web.xml? Является ли ваше приложение использующим вышеупомянутое заявление в его собственном файле context.xml (META-INF) - если да, можете ли вы опубликовать это? Btw при использовании ресурса JDBC singleton должен быть «true», – swinkler

ответ

6

Я имел ту же ошибку и решить ее путем добавления регистрации = «ignoreExisting» к MBean-экспортной части:

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

У нас была та же проблема. Мы объявили наш источник данных как весенний боб, и похоже, что и весна, и сама фаза пытаются зарегистрироваться, и Mbean, которая ведет к этому конфликту. Все, что нам нужно сделать, это настроить наш MBean Exporter, как это:

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

Хотя я полагаю, установление учетной политики для:

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING); 

может также работать.

0

Если вы хотите, решения с использованием аннотаций Spring загрузки уже определяет MBeanExporter боба, так что вы можете автоматически провод на нем

@Autowired 
MBeanExporter mBeanExporter ; 

Затем измените регистрационную политику

mBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);