簡體   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