Блокировка пула соединений DBCP (открытие и закрытие соединения).Является ли пул соединений с базой данных в OpenEJB подключаемым? - PullRequest
0 голосов
/ 31 января 2011

Мы используем OpenEJB на Tomcat (используется для запуска на 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 голос
/ 18 февраля 2011

Решена проблема с блокировкой dbcp путем изменения конфигурации пула ( openejb.xml ):

TestOnBorrow false

Спасибо, Andy ,от команды OpenEJB!

1 голос
/ 03 февраля 2011

Мои 2 cts ...

1 - Существуют ли какие-либо конфигурации DBCP, которые могут исправить блокировку?

Хотя я не могу увидеть это в документе, я думаютакже должен быть атрибут настройки с именем «WhenExaustedAction» в узле ресурса, который может принимать значение «GROW» (значение 2), а не «BLOCK» (значение 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 и, по крайней мере, connectionCacheName и connectionCacheProperties.Таким образом, я бы убедил DBCP поверить в то, что он выполняет реальную работу и фактически использует механизм пула Oracle.Это также означало бы принятие минимального риска с использованием DBCP и, следовательно, более либеральную настройку параметра maxActive.

...