我们在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)
....
几个问题。
- 我几乎可以肯定,一些事务性属性和属性,以这种阻塞贡献,但多边开发银行的定义非事务性(我们使用这两种注释和ejb-jar.xml中)。有些EJB确实使用容器管理的事务(我们也可以观察到阻塞)。有没有可以修复阻塞的DBCP配置?
- 是否可以在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>
谢谢,阿兰。将连接返回到池时发生阻塞的部分秘密。 'WhenExhaustedAction'用于检索连接。任何想法我需要激活JMX访问DBCP池的配置?到目前为止,在openejb下的JMX控制台中,我们只能看到EJB池。 – topchef 2011-02-07 16:06:27