jmx mbean 服务器在更改 c3p0 版本时抛出 InstanceAlreadyExistsException

jmx mbean server throw InstanceAlreadyExistsException when change c3p0 version

c3p0-0.9.1.2c3p0-0.9.5 之间有什么区别,这意味着当我想在 0.9.1.2 中用 DynamicPooledDataSourceManagerMBean 注册一个 MBean 时,一切都很好,但是当我使用 0.9.5 然后 com.sun.jmx.mbeanserver.Repository 抛出一个 javax.management.InstanceAlreadyExistsException.

我使用 spring 作为我的容器,所以 DynamicPooledDataSourceManagerMBean 的 bean 定义是这样的:

<bean id="register" class="com.mchange.v2.c3p0.management.DynamicPooledDataSourceManagerMBean">
   <constructor-arg index="0" ref="dataSource"/>
   <constructor-arg index="1" value="my.pool.connection:type=c3p0,name=Main"/>
   <constructor-arg index="2" ref="mbeanServer"/>
</bean>

其中数据源引用定义是 com.mchange.v2.c3p0.ComboPooledDataSource 并且定义如下:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="true" >
        and a lot of datasource config

mbeanSever 是一个 Spring org.springframework.jmx.support.MBeanServerFactoryBean ,其定义如下:

<bean name="mbeanServer"
    class="org.springframework.jmx.support.MBeanServerFactoryBean">
    <property name="locateExistingServerIfPossible" value="true" />
    <property name="registerWithFactory" value="true"></property>
</bean>

正如@SteveWaldman 所说,问题是我试图将我的数据源注册到 c3p0 之前注册的 MBean 服务器中。所以我应该做的是什么。 但是需要对 c3p0 注册的内容进行一些修改。 c3p0 使用这样的名称注册数据源:

com.mchange.v2.c3p0:type=PooledDataSource,identityToken=1hgeowz961y14x0ldebkgx|1‌​23f9b8,name=Main

我想避免添加 identityToken,所以如前所述 here 我创建了一个 c3p0.properties 文件并将这一行放入其中:

com.mchange.v2.c3p0.management.ExcludeIdentityToken=true

这几乎就是我为我的案子所做的一切。感谢@StevenWaldman。