迁移到 Tomcat 8:实例已存在异常数据源

2022-09-01 17:36:16

我有一个关于Tomcat 8中的上下文配置的问题。我将项目从Tomcat 7迁移到8,并遇到异常问题:如果配置中没有更改,我遇到了一个错误:

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

部分上下文:

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

所以,它在tomcat 7中工作没有任何问题。在Tomcat 8中,我可以通过两种方式解决这个问题:

  1. 通过添加到资源:singleton = "false";
  2. 通过添加到资源:factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

如果我清楚地了解tomcat为我的应用程序和jmx创建数据源,但在Tomcat 7中它是单个对象,在Tomcat 8中它必须是不同的。所以我的问题是为什么会发生这种情况?我在文档中找不到有关此更改的任何信息。有趣的是,什么更好:创建单个数据源(我认为是这样)或按工厂创建多个数据源。


答案 1

我们遇到了同样的问题。我们将数据源声明为弹簧豆,看起来 spring 和 bean 本身都试图注册导致此冲突的 Mbean。我们所要做的就是像这样配置我们的Mbean导出器:

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

虽然我认为将注册策略设置为:

annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);

也可能有效。


答案 2

我遇到了同样的错误,并通过在mbean导出部分添加register=“ignoreExisting”来解决它:

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

推荐