jdbc4 CommunicationsException - PullRequest
       5

jdbc4 CommunicationsException

9 голосов
/ 20 июля 2009

У меня есть машина, на которой запущено приложение java, которое разговаривает с экземпляром mysql, работающим на том же экземпляре. приложение использует драйверы jdbc4 от mysql. Я продолжаю получать com.mysql.jdbc.exceptions.jdbc4.CommunicationsException в случайное время.

Вот и все сообщение.

Не удалось открыть соединение JDBC для транзакции; вложенное исключение

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was25899 milliseconds ago.The last packet sent successfully to the server was 25899 milliseconds ago, which  is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

Для mysql значение global 'wait_timeout' и 'interactive_timeout' установлено на 3600 секунд, а 'connect_timeout' установлено на 60 секунд. значение времени ожидания намного выше, чем 26 секунд (25899 мсек). упоминается в следе исключения.

Я использую dbcp для пула соединений, и вот конфигурация bean-компонента Spring для источника данных.

   <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource" >
          <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/db"/>
                <property name="username" value="xxx"/>
                <property name="password" value="xxx" />
                    <property name="poolPreparedStatements" value="false" />
            <property name="maxActive" value="3" />
            <property name="maxIdle" value="3" />
    </bean>

Есть идеи, почему это может происходить? Решит ли проблема использование c3p0?

Ответы [ 4 ]

6 голосов
/ 09 августа 2009

Попробуйте правильно настроить DBCP Apache Commons.

Вам необходимо установить:

  • validationQuery для выбора 1 + 1
  • testOnBorrow к true

Это должно решить проблему.

1 голос
/ 21 июля 2009

Можете ли вы описать, как ваше приложение обрабатывает пулы соединений? Я сомневаюсь, что autoReconnect = true в драйвере JDBC повторно объединит подключения из вашего приложения. Приложение должно восстановить соединение, когда оно теряет соединение.

0 голосов
/ 27 июля 2009

Ранее я видел, что машины Windows, которые были перемещены в сети, испытывали проблемы с подключением к себе.

Есть ли какие-либо проблемы с подключением за пределами JVM - то есть клиент mysql, подключающийся к серверу, время ожидания и т. Д.?

0 голосов
/ 20 июля 2009

Я бы последовал совету в исключении. Вы должны рассмотреть либо:

  1. истекает и / или проверяется правильность подключения перед использованием в вашем приложении,
  2. увеличение значений, настроенных сервером для времени ожидания клиента, или
  3. используя свойство соединения Connector / J 'autoReconnect = true', чтобы избежать этой проблемы. Попробуйте добавить это к URL-адресу вашего соединения (точный синтаксис см. В документации) и посмотрите, поможет ли это.

Я сомневаюсь, что C3P0 будет намного лучше, чем DBCP, который вы уже используете. Исключением является конкретный совет. Вы пробовали № 3. А как насчет двух других?

Я знаю, как попросить WebLogic проверить соединения перед их использованием. Вы должны узнать, как сделать то же самое с Tomcat.

...