如何链接c3p0池identityTokens和JDBC池名称

时间:2018-05-17 14:09:00

标签: java jmx monitor c3p0 jdbc-pool

首先,请记住,我是监控管理员,而不是Java开发人员。

我想要监控 c3p0 池的某些属性值,我发现这些池有一个唯一的 identity Token ,它由一个字母数字字符串组成与管道字符连接的十六进制字符串,例如:

2rxggs9vtsz4i48lg1tk|665e33d4

但是,tomcat服务器的 context.xml 文件中的JDBC池仅显示标准名称:

    <Resource name="jdbc/EXAMPLE"
            jdbcUrl="jdbc:oracle:thin:@oracle:1521:PRExxx" user="EXAMPLE"
            password="my34xXple" auth="Container" description="DB Connection"
            driverClass="oracle.jdbc.driver.OracleDriver" maxPoolSize="50"
            minPoolSize="2" maxIdleTime="30" checkoutTimeout="2000"
            acquireIncrement="1" maxConnectionAge="3600"
            factory="org.apache.naming.factory.BeanFactory" type="com.mchange.v2.c3p0.ComboPooledDataSource"
            preferredTestQuery="SELECT 1 FROM dual" />

我使用JAR通过JMX连接查询正在运行的Java进程的MBean。 这里有Catalina:type=Resource个:

Catalina:type=Resource,resourcetype=Context,path=/myapp,host=localhost,class=com.mchange.v2.c3p0.ComboPooledDataSource,name="jdbc/EXAMPLE"/scope (String) = Shareable
Catalina:type=Resource,resourcetype=Context,path=/myapp,host=localhost,class=com.mchange.v2.c3p0.ComboPooledDataSource,name="jdbc/EXAMPLE"/description (String) = DB Connection
Catalina:type=Resource,resourcetype=Context,path=/myapp,host=localhost,class=com.mchange.v2.c3p0.ComboPooledDataSource,name="jdbc/EXAMPLE"/name (String) = jdbc/EXAMPLE
Catalina:type=Resource,resourcetype=Context,path=/myapp,host=localhost,class=com.mchange.v2.c3p0.ComboPooledDataSource,name="jdbc/EXAMPLE"/type (String) = com.mchange.v2.c3p0.ComboPooledDataSource

此处 com.mchange.v2.c3p0

com.mchange.v2.c3p0:type=C3P0Registry/AllIdentityTokenCount (Integer) = 15
com.mchange.v2.c3p0:type=C3P0Registry/AllIdentityTokenizedCount (Integer) = 15
com.mchange.v2.c3p0:type=C3P0Registry/AllPooledDataSourcesCount (Integer) = 5
com.mchange.v2.c3p0:type=PooledDataSource[2rxggs9vtsz4i48lg1tk|665e33d4]/dataSourceName (String) = 2rxggs9vtsz4i48lg1tk|665e33d4
com.mchange.v2.c3p0:type=PooledDataSource[2rxggs9vtsz4i48lg1tk|665e33d4]/threadPoolNumIdleThreads (Integer) = 3
com.mchange.v2.c3p0:type=PooledDataSource[2rxggs9vtsz4i48lg1tk|665e33d4]/acquireRetryAttempts (Integer) = 30
com.mchange.v2.c3p0:type=PooledDataSource[2rxggs9vtsz4i48lg1tk|665e33d4]/autoCommitOnClose (Boolean) = false
com.mchange.v2.c3p0:type=PooledDataSource[2rxggs9vtsz4i48lg1tk|665e33d4]/identityToken (String) = 2rxggs9vtsz4i48lg1tk|665e33d4

这是我的问题:

  1. 如何链接身份标记和资源池名称?

  2. 在我的示例应用中,context.xml文件中定义了5个资源,但有15个c3p0池。这也可以在C3P0Registry/AllIdentityTokenizedCountC3P0Registry/AllPooledDataSourcesCount属性中找到。是不是有一对一的关系?

  3. 身份令牌是如何制作的?它们是随机的吗?这两个字符串是什么意思?它们是否与流程或机器值相关联?

  4. 由于

1 个答案:

答案 0 :(得分:1)

  1. <Resource name="...">名称是jndi名称,与JMX名称没有必要的连接。如果您希望有连接,请将属性dataSourceName设置为一致的名称。

  2. PooledDataSources与身份令牌/令牌化之间没有一对一的关系。典型的PooledDataSource可能包含三个身份标记化元素。但是,每个PooledDataSource应该只有一个JMX bean。

  3. 身份令牌基本上是随机值,但基于主机的某些确定性部分,旨在确保不会发生冲突。 (Java现在内置了对UUID的支持,但是在编写c3p0时却没有。)

  4. 您可能希望不必处理c3p0 DataSource管理中的身份令牌内容。只要您确保DataSource每个都具有唯一dataSourceName集,就可以从JMX名称中删除标识令牌,并具有稳定,可重现的JMX名称。请参阅Configuring and Managing c3p0 via JMX