2011-01-31 134 views
0

我们在Tomcat上使用OpenEJB(用于在JBoss,Weblogic等上运行)。在运行负载测试时,我们在处理JMS消息(队列)时遇到了显着的性能问题。问题被本地化为阻止数据库连接池获取或释放与池的连接。阻止阻止并发的MDB实例(线程)运行,因此性能下降10倍甚至更糟。用于在应用程序服务器上运行的代码(以及它们各自的连接池实现)完全没有阻塞。螺纹的阻塞DBCP连接池(打开和关闭连接)。 OpenEJB可插入数据库连接池吗?

实施例阻止:

Name: JMS Resource Adapter-worker-23 
State: BLOCKED on [email protected] owned by: JMS Resource Adapter-worker-19 
Total blocked: 18,426 Total waited: 0 

Stack trace: 
org.apache.commons.pool.impl.GenericObjectPool.returnObject(GenericObjectPool.java:916) 
org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:91) 
    - locked [email protected] 
org.apache.commons.dbcp.managed.ManagedConnection.close(ManagedConnection.java:147) 
com.xxxxx.persistence.DbHelper.closeConnection(DbHelper.java:290) 
.... 

几个问题。

  1. 我几乎可以肯定,一些事务性属性和属性,以这种阻塞贡献,但多边开发银行的定义非事务性(我们使用这两种注释和ejb-jar.xml中)。有些EJB确实使用容器管理的事务(我们也可以观察到阻塞)。有没有可以修复阻塞的DBCP配置?
  2. 是否可以在OpenEJB中替换DBCP连接池实现?用另一个库替换它有多容易(困难)?

以防万一,这是我们在OpenEJB的定义数据源(openejb.xml):

<Resource id="MyDataSource" type="DataSource"> 
    JdbcDriver oracle.jdbc.driver.OracleDriver 
    JdbcUrl ${oracle.jdbc} 
    UserName ${oracle.user} 
    Password ${oracle.password} 
    JtaManaged true 
    InitialSize 5 
    MaxActive 30 
    ValidationQuery SELECT 1 FROM DUAL 
    TestOnBorrow true 
</Resource> 

回答

1

通过改变池配置(openejb.xml)解决与DBCP阻塞问题:

TestOnBorrow false

谢谢Andy,从OpenEJB的团队!

1

我的2克拉...

1 - 是否有任何DBCP配置 可能会修复阻止?

虽然我不能看到它的医生,我觉得也应该有在资源节点名为“WhenExaustedAction”设置属性,可以采取值“成长”(值2),而不是“堵” (值1)或“FAIL”(值0)。这直接来自池共同。 Hibernate和Cayenne都使用这种DBCP设置。不过不知道OpenEJB。

不需要说,只有当所有连接完全关闭时(这有时难以保证),这才会起作用。 然后,您可以通过JMX看到在活动高峰时间需要多少个连接,然后可以将maxActive设置为从这些度量发展而来的更高值。

2 - DBCP连接池实现 可以在OpenEJB中替换吗? (难)如何轻松地用另一个 库替换它?

抱歉不知道。想象是的。或者可能DBCP允许另一个连接池管理器。

更新:只是看看代码,它似乎DBCP是连接池的唯一选项。

顺便说一下,我已经看到了whenExhaustedAction设置。 openejb.xml不支持。
但是,由于您使用的是Oracle数据库,因此仍然会有一个选项。
您可以尝试的一件事是使用Oracle隐式连接缓存(假设版本为10g),并将任意“足够”的连接数量留给DBCP。 为此,您需要在openejb.xml资源块中配置ConnectionProperties属性并使用Oracle JDBC连接属性。这是connectionCachingEnabled=true和至少connectionCacheNameconnectionCacheProperties。通过这种方式,我会引诱DBCP相信它正在做真正的工作,并真正使用Oracle的池化机制。这也意味着DBCP几乎没有风险,因此maxActive设置的自由度更大。

+0

谢谢,阿兰。将连接返回到池时发生阻塞的部分秘密。 'WhenExhaustedAction'用于检索连接。任何想法我需要激活JMX访问DBCP池的配置?到目前为止,在openejb下的JMX控制台中,我们只能看到EJB池。 – topchef 2011-02-07 16:06:27