【发布时间】:2015-01-13 16:21:47
【问题描述】:
c3p0-0.9.1.2 和 c3p0-0.9.5 之间有什么区别,这意味着当我想在 DynamicPooledDataSourceManagerMBean 中注册 MBean 和 0.9.1.2 时,一切正常,但是当我使用 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>
dataSource ref 定义是 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>
【问题讨论】:
-
您不需要或不想显式注册 MBean。 c3p0 将尝试自动执行此操作,除非您使用
com.mchange.v2.c3p0.management.ManagementCoordinator=com.mchange.v2.c3p0.management.NullManagementCoordinator关闭它 -
我应该把这个配置放在哪里?
-
这里的问题是我需要区分导出的不同 MBean,c3p0 使用如下名称注册它们:com.mchange.v2.c3p0:type=PooledDataSource,identityToken=1hgeowz961y14x0ldebkgx|123f9b8,name= Main 我怎样才能给它一个名字并防止添加 identittyToken?
-
该配置将放在 c3p0.properties 文件中或作为系统属性,最常见的是。 (如果您使用它们,它也可以放在 HOCON/typesafe-config 文件中。)您可能(或可能不会!)通过关闭 c3p0 的 MBean 自动注册,使用 @987654339 来使您现有的配置正常工作。 @见mchange.com/projects/c3p0/#jmx_configuration_and_management
-
但是,更安全、更明智的做法是,考虑让 c3p0 按预期注册其 MBean。您可以通过 dataSourceName 属性设置 MBean 的名称(它本身可以通过 Constructor 参数或作为普通 bean 属性设置)。如果您不希望身份令牌出现在 JMX 名称中,请设置(再次在 c3p0.properties 中或作为系统属性)
com.mchange.v2.c3p0.management.ExcludeIdentityToken=true(但您有责任确保 JMX 名称始终是唯一的。)再次,见mchange.com/projects/c3p0/#jmx_configuration_and_management
标签: java spring jmx c3p0 mbeans