繁体   English   中英

阻塞DBCP连接池(打开和关闭连接)。 OpenEJB中的数据库连接池是否可插入?

[英]Blocking on DBCP connection pool (open and close connection). Is database connection pooling in OpenEJB pluggable?

我们在Tomcat上使用OpenEJB(用于在JBoss,Weblogic等上运行)。 在运行负载测试时,我们在处理JMS消息(队列)时会遇到严重的性能问题。 问题仅限于阻止数据库连接池获取或释放与该池的连接。 阻塞阻止并发MDB实例(线程)运行,因此性能遭受10倍甚至更糟的影响。 用于在应用程序服务器上运行相同的代码(及其各自的连接池实现),完全没有阻塞。

线程阻塞的示例:

Name: JMS Resource Adapter-worker-23
State: BLOCKED on org.apache.commons.pool.impl.GenericObjectPool@1ea6b4a 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 org.apache.commons.dbcp.PoolableConnection@1bcba8
org.apache.commons.dbcp.managed.ManagedConnection.close(ManagedConnection.java:147)
com.xxxxx.persistence.DbHelper.closeConnection(DbHelper.java:290)
....

几个问题。

  1. 我几乎可以肯定,某些​​事务属性和属性会导致这种阻塞,但是MDB被定义为非事务性的(我们同时使用了注释和ejb-jar.xml)。 但是,某些EJB确实使用容器管理的事务(并且我们也可以观察到那里的阻塞)。 是否有任何DBCP配置可以解决阻塞问题?
  2. DBCP连接池实现可以在OpenEJB中替换吗? 用另一个库替换它有多容易(困难)?

以防万一,这就是我们在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>

我的2克拉...

1-是否有任何DBCP配置可以解决阻塞问题?

尽管我在文档中看不到它,但我认为Resource节点中还应该有一个名为“ WhenExaustedAction”的设置属性,该属性可以采用值“ GROW”(值2),而不是“ BLOCK”(值1)或“ FAIL”(值0)。 这直接来自Pools的常见问题。 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设置的大小。

通过更改池配置( openejb.xml )解决了dbcp阻塞的问题:

TestOnBorrow false

谢谢OpenEJB团队的Andy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM