JDBC CommunicationsException с базой данных MySQL - PullRequest
1 голос
/ 04 мая 2010

У меня небольшая проблема с MySQL-Connection-Pooling. Это тот случай:

Различные работы запланированы через Кварц. Все задания подключаются к разным базам данных, которые прекрасно работают весь день, в то время как запланированные на ночь задания не выполняются с CommunicationsException ...

Кварцевый Работа:

Job1 runs 0 0 6,10,14,18 * * ?
Job2 runs 0 30 10,18 * * ?
Job3 runs 0 0 5 * * ?

Как видно, последнее задание выполняется в 18 часов и занимает около 1 часа. Первая работа в 5 утра - это та, которая провалилась. Я уже попробовал все виды комбинаций параметров в моей конфигурации ресурса, это то, что я сейчас запускаю:

<!-- Database 1 (MySQL) -->
<Resource
 auth="Container"
 driverClassName="com.mysql.jdbc.Driver"
 maxActive="100"
 maxIdle="30"
 maxWait="10000"
 removeAbandoned="true"
 removeAbandonedTimeout="60"
 logAbandoned="true"
 type="javax.sql.DataSource"
 name="jdbc/appDbProd"
 username="****"
 password="****"
 url="jdbc:mysql://127.0.0.1:3306/appDbProd?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"
 testWhileIdle="true"
 testOnBorrow="true"
 testOnReturn="true"
 validationQuery="SELECT 1"
 timeBetweenEvictionRunsMillis="1800000"
/>

<!-- Database 2 (MySQL) -->
<Resource
 auth="Container"
 driverClassName="com.mysql.jdbc.Driver"
 maxActive="100"
 maxIdle="30"
 maxWait="10000"
 removeAbandoned="true"
 removeAbandonedTimeout="60"
 logAbandoned="true"
 type="javax.sql.DataSource"
 name="jdbc/prodDbCopy"
 username="****"
 password="****"
 url="jdbc:mysql://127.0.0.1:3306/prodDbCopy?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"
 testWhileIdle="true"
 testOnBorrow="true"
 testOnReturn="true"
 validationQuery="SELECT 1"
 timeBetweenEvictionRunsMillis="1800000"
/>
<!-- Database 3 (MSSQL)-->
<Resource
 auth="Container"
 driverClassName="net.sourceforge.jtds.jdbc.Driver"
 maxActive="30"
 maxIdle="30"
 maxWait="100"
 removeAbandoned="true"
 removeAbandonedTimeout="60"
 logAbandoned="true"
 name="jdbc/catalogDb"
 username="****"
 password="****"
 type="javax.sql.DataSource"
 url="jdbc:jtds:sqlserver://127.0.0.1:1433;databaseName=catalog;useNdTLMv2=false"
 testWhileIdle="true"
 testOnBorrow="true"
 testOnReturn="true"
 validationQuery="SELECT 1"
 timeBetweenEvictionRunsMillis="1800000"
/>

По понятным причинам я изменил IP-адреса, имена пользователей и пароли, но их можно считать правильными, поскольку приложение работает успешно весь день.

Самое раздражающее: Первое задание, которое запускает первые, успешно запрашивает Database2, но по какой-то причине не выполняет запрос к Database1 (CommunicationsException):

вызвано: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Последний пакет успешно получен с сервера было 39,376,539 миллисекунды назад Последний пакет успешно отправлен на сервер был 39 376 539 миллисекунд назад. длиннее чем сервер настроил значение 'Wait_timeout. Вы должны рассмотреть либо истекает и / или тестирование срок действия соединения перед использованием в вашем приложение, увеличивающее сервер настроенные значения для времени ожидания клиента, или используя соединение Connector / J свойство 'autoReconnect = true', чтобы избежать эта проблема.

Есть идеи? Спасибо!

Ответы [ 3 ]

0 голосов
/ 04 мая 2010

Я получаю эту ошибку, когда соединение какое-то время не используется. Ваши задания перестают работать с БД в какой-то момент, а затем выполняются некоторые запросы?

Это также происходит, когда происходит сбой соединения, возможно, вы захотите узнать у сетевой команды, не прерывается ли соединение.

0 голосов
/ 15 декабря 2010

Я столкнулся с подобной проблемой при использовании Oracle и JDBC. В итоге я использовал все соединения, которые были доступны для базы данных, и я не отказывался ни от одного из них, и мой код просто остановился или остановился. Посмотрите, как вы обрабатываете свои соединения в своем коде.

0 голосов
/ 04 мая 2010

Как говорится, включите проверку соединения в пуле соединений.

...