我试图在同一个tomcat7实例上部署两个WAR文件(app1.war end app2.war)。我收到此错误:
Unable to register MBean [HikariDataSource (HikariPool-0)] with key
'dataSource'; nested exception is javax.management.InstanceAlreadyExistsException:
com.zaxxer.hikari:name=dataSource,type=HikariDataSource
如果我在tomcat上只部署了一个应用程序,则没有此错误。有没有办法解决这个问题?
在spring boot中,jmx bean在运行时加载,它会扫描你的应用程序。如果找到两个数据源,则会抛出javax.management.InstanceAlreadyExistsException。这可以通过在application.properties文件中定义默认的jmx默认域名来解决,如下所示
spring.jmx.default-domain=app_name
我希望这有帮助。
在Spring Boot中,您可以通过application.properties更改Hikari数据源池的名称:
spring.datasource.hikari.poolName=MyDataPoolName
或者application.yml:
spring:
datasource:
hikari:
pool-name: MyDataPoolName
然后Tomcat可以加载两个应用程序,名称冲突消失了。
为您的数据源提供唯一的名称。例如,如果您有用于存储用户和产品数据的单独模式,则可以分别命名数据源userDS
和productDS
。
HikariDataSource userDS = new HikariDataSource();
userDS.setPoolName("userDS");
// Set other data source properties.
HikariDataSource productDS = new HikariDataSource();
productDS.setPoolName("productDS");
// Set other data source properties.
<bean id="userDS" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="poolName" value="userDS"/>
...
</bean>
<bean id="productDS" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="poolName" value="productDS"/>
...
</bean>