2009-10-02 4 views
14

Я получил эту ошибку из кода продукции:ВОПРОИЗВЕДЕНИЕ com.mysql.jdbc.exceptions.jdbc4.CommunicationsException с установкой весны, спящий режим и C3P0

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : последний пакет успешно принят от сервера was36940 секунд ago.The последнего пакета успешно отправлен на сервер были 36940 секунд назад, , который длиннее, чем сервер сконфигурирован значения «wait_timeout». Вы должны рассмотреть либо истекающего и/или соединение тестирования достоверности перед использованием в приложении, увеличивая сервер настроен значения для клиента тайм-аута, или с помощью разъема/J подключение свойство «autoReconnect = истина», чтобы избежать этого проблема.

И теперь я пытаюсь воспроизвести проблему локально и исправить ее. Я настроить контекст пружины следующим образом:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close" p:driverClass="com.mysql.jdbc.Driver" 
    p:jdbcUrl="jdbc:mysql://localhost:3306/test?userUnicode=yes&amp;characterEncoding=UTF-8&amp" 
    p:idleConnectionTestPeriod="120" p:initialPoolSize="1" p:maxIdleTime="1800" 
    p:maxPoolSize="1" p:minPoolSize="1" p:checkoutTimeout="1000" 

/> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="hibernateProperties"> 
     <value> 
      hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider 
      hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
      hibernate.default_schema=platform_server_original 
      hibernate.show_sql=false 
     </value> 
    </property> 
    <property name="mappingResources"> 
     <list> 
      <value>sometables.hbm.xml</value> 
     </list> 
    </property> 
</bean> 

Затем я установил мой MySQL WAIT_TIMEOUT до 10 секунд, а затем запустить мой тест, который является в основном открыть соединение, сделать запрос, закройте его, так что он возвращается в пул , затем снизьте поток в течение 15 секунд, а затем снова откройте соединение и снова выполните запрос, чтобы он сломался. Тем не менее, я получил подобную ошибку только:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: связи Отказ канала

Последний пакет, отправленный на сервер был 16 мс назад.

Так что я думаю, эти две ошибки одинаковы или они разные? Я сделал несколько исследований, и, похоже, обе ошибки сводились к одному и тому же решению: с использованием свойства «testConnectionOnCheckout = true». Однако, согласно документу c3p0, это очень дорогая проверка. Он советует использовать «idleConnectionTestPeriod», но я уже устанавливаю его на 120 секунд. Какое значение я должен использовать, чтобы он мог корректно проверить соединение в режиме ожидания?

Так что я в основном задаю две вещи: 1. Как воспроизвести ошибку, которую я получил в производственном коде? 2. Как его исправить?

Спасибо!

+0

Вашей первоначальная ошибка от производства говорит о периоде времени, в течение 10 часов и происходит, когда соединение извлеченное когда система первой используется утром? Разве вы не можете установить минимальный размер пула на 0 или разоблачить пул через JXB и сбросить его до начала рабочего дня? – SteveD

+0

@fei - Вы разрешили это? Будьте заинтересованы, чтобы узнать, каков был результат. –

+1

Я закончил использовать следующие 2 свойства: testConnectionOnCheckout = "true" preferredTestQuery = "select 1" Не самое оптимальное решение, но оно решает проблему как минимум. – fei

ответ

0

Fei - может быть одной из нескольких вещей, на самом деле не может говорить на основе информации, размещенной до сих пор.

Предлагайте вам добавить номера версии MySQL/Spring/Hibernate/C3PO/JDBC на ваш вопрос, если есть известная проблема.

Сообщение об ошибке в производстве является общим, с множеством возможных причин. Некоторые выводы для вас:

  1. Ошибка производства может указывать , что ваше приложение не высвобождая соединение назад к купальню, когда сделано с ним, предотвращая C3P0 от проверки.(На холостом ходу проверки c3p0 может быть применен только к соединений бесконтрольно-аут.)

  2. Убедитесь, что c3p0 действительно работает (вы можете использовать «ваниль» соединения, если нет). В тесте, если вы установили (например) MySql wait_timeout = 10, поток приложения сон = 35, и idleConnectionTestPeriod = 30, если объединение работает, исключение должен уйти.

  3. На счет холостых проверок: рекомендует отказаться от использования по умолчанию getTables в() - может быть установлен preferredTestQuery на что-то дешевое (-er) 'SELECT 1' может быть, для MySQL?

0

Чтобы воспроизвести вашу ошибку, установите тайм-аут соединения в свойствах MySQL на очень низком значении, т.е. 2 мс, и выполнить запрос, как известно, имеют много времени обработки. Вы можете установить свойство тайм-аута либо в строке подключения MySQL, либо через свойство, если вы используете файлы свойств для настройки вашего соединения JDBC. Вы можете найти Javadocs в своем конкретном соединении jaxax.sql.DataSource и в документах MySQL, чтобы узнать, как это сделать.

+1

Значение MySQL wait_timeout равно секунды, а не ms. Так что его невозможно установить на 2 мс? –

3

У меня были схожие проблемы с MySQL и пулом соединений. Проблема заключается в том, что вы сообщаете пулу подключений, что тайм-аут простоя составляет 30 минут, но база данных отключает соединение через 10 секунд. Поскольку ваш период проверки соединения на холостом ходу составляет 120 секунд, он оставляет немного меньше 110 секунд, чтобы пул использовал сломанное соединение!

Я хотел бы использовать следующие параметры для производства:

MySQL: 
wait_timeout=75 
C3P0: 
maxIdleTime=60 
idleConnectionTestPeriod=55 
Смежные вопросы