2012-02-09 3 views
1

Я использую Spring 3.0.5, Hibernate 3.6.7, Atomikos TransactionEssentials 3.7.0 и MySQL 5.5резюме для XID поднял 0: неизвестно

Недавно я столкнулся с проблемой, что связи в моем connectionpool timedout после 8 часов и были сброшены сервером, вызывая сообщение «резюме для XID» ??? поднятые 0: неизвестно

Вот моя конфигурация DataSource:

<bean id="myDataSource" 
     class="com.atomikos.jdbc.AtomikosDataSourceBean" 
     init-method="init" 
     destroy-method="close" 
     depends-on="myConfigurer"> 
    <property name="uniqueResourceName" value="myPUDataSource" /> 
    <property name="xaDataSourceClassName" value="$CONF{database.XAdriver}" /> 
    <property name="poolSize" value="10" /> 
    <property name="xaProperties"> 
     <props> 
      <prop key="user">$CONF{database.user}</prop> 
      <prop key="password">$CONF{database.password}</prop> 
      <prop key="URL">$CONF{database.url}</prop> 
      <prop key="pinGlobalTxToPhysicalConnection">true</prop> 
      <prop key="autoReconnect">true</prop> 
     </props> 
    </property> 
</bean> 

Как я исследовал, я обнаружил, что вариант autoReconnect = верно только воссоединяется мое неисправное соединение после задержки в 2 секунды (что configurabe I Думаю) Просмотр в Интернете Я нашел решения, предлагающие увеличить wait_timeout в MySQL-Server, что, я думаю, не является реальным решением. Приложение должно иметь возможность обрабатывать мертвые соединения и автоматически подключаться, поскольку могут возникнуть другие проблемы, вызывающие потеря связи тоже. (И я не хочу делать какие-либо директивы для серверов любого рода приложение использует).

Наконец-то я нашел хорошее решение для этого, которое я опубликую в качестве ответа, чтобы помочь людям, сталкивающимся с теми же или похожими проблемами.

+0

Это печально. Я не могу ответить на это в течение следующих 8 часов. Почему это всегда 8 часов? Работа 8 часов в день, wait_timeout = 8 часов, подождите, пока мне позволено ответить: 8 часов. Разве это не должно быть 23 или, может быть, 42? – AlexS

ответ

2

Вставив строку:

<property name="testQuery" value="SELECT 1"/> 

от конфигурации источника данных, кажется, соединение проверено перед использованием и возобновлена ​​в случае он мертв. Я пробовал его с wait_timeout=60 и даже с перезагрузкой MySQL-сервера во время моего приложения ...

Результат: не более Исключения и ошибки!