Зависание соединения с драйвером DB2 в пуле соединений Glassfish - PullRequest
0 голосов
/ 03 июня 2010

У нас периодически возникает проблема с DB2, используемой из пула соединений Glassfish. Что происходит, это:

В ситуациях, когда база данных (DB2 on ZOS) находится в состоянии стресса, наше приложение (многопоточное приложение, использующее соединения с DB2 через пул соединений Glassfish) перестает что-либо делать.

Наблюдаются следующие данные:

1) Глядя на сервер с помощью JConsole, мы видим поток, ожидающий бесконечно в методе драйвера DB2 getConnection (). Мы также можем видеть, что он получил блокировку вектора в драйвере. Несколько других потоков также вызывают метод getConnection () в драйвере и зависают в ожидании снятия блокировки на векторе.

2) Глядя на саму базу данных, мы видим, что есть соединения с сервера Glassfish, открытые и ожидающие использования. Похоже, что существует какое-то несоответствие между пулом соединений в Glassfish и соединениями, фактически открытыми для DB2.

Кто-нибудь сталкивался с этой проблемой раньше? Или что-то подобное? Если вам нужна дополнительная информация, которую я не предоставил, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 04 июня 2010

Связано возможно: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4263113

ты на jdk1.5?


Из блога:

В Java 1.5 и более ранних версиях все методы в java.sql.DriverManager синхронизированы. Ваш первоначальный вызов DriverManager.getConnection (...) запускает запуск HA-JDBC. При инициализации HA-JDBC он в конечном итоге вызовет DriverManager.getDriver (...) для каждого URL базы данных в вашем кластере. Вызовы DriverManager.getDriver (...) происходят в потоке, отличном от потока вашего приложения, следовательно, в тупике.

Существует как минимум 2 известных решения этой проблемы:

  • Обновление до Java 1.6. После того, как навсегда настаивал на том, что полная синхронизация java.sql.DriverManager не была дефектом, Sun молча исправила это в Java 1.6.

  • Вместо того чтобы использовать DriverManager.getConnection (...) для получения соединений, используйте вместо этого DriverManager.getDriver (...). Connect (...). Это позволит обойти взаимоблокировку, поскольку DriverManager.getDriver (...) не будет запускать запуск HA-JDBC, а Driver.connect (...) не синхронизируется.

...