【问题标题】:jmx mbean server throw InstanceAlreadyExistsException when change c3p0 versionjmx mbean 服务器在更改 c3p0 版本时抛出 InstanceAlreadyExistsException
【发布时间】:2015-01-13 16:21:47
【问题描述】:

c3p0-0.9.1.2c3p0-0.9.5 之间有什么区别,这意味着当我想在 DynamicPooledDataSourceManagerMBean 中注册 MBean0.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


【解决方案1】:

正如@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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多