2015-07-17 5 views
1

У меня есть полное приложение Spring Mvc Spring, работающее с Spring Security, но я получаю следующую ошибку, когда сервер не был активен в то время, а кто-то пытается войти в систему:Не удалось открыть сеанс Hibernate для транзакции при первом входе

Состояние HTTP 500 - обработка запроса не удалась; Вложенное исключение - org.springframework.transaction.CannotCreateTransactionException: не удалось открыть сеанс Hibernate для транзакции; Вложенное исключение - org.hibernate.TransactionException: JDBC начинает транзакцию с ошибкой

Иногда после (примерно через 5 секунд) он начинает работать нормально.

Я искал и нашел эту ссылку: http://forum.spring.io/forum/spring-projects/data/13298-could-not-open-hibernate-session-for-transaction-jdbc-begin-failed , но я не знаю, как «настроить тестирование подключения в конфигурации пула соединений».

Любые советы?

EDIT:

Я нашел ссылку, чтобы установить бассейн конфигурации:

http://www.codingpedia.org/ama/tomcat-jdbc-connection-pool-configuration-for-production-and-development/

поэтому я попытался реализовать в моем источнике данных:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 

     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 

     <property name="url" value="jdbc:mysql://192.168.254.45:3306/7jogos" /> 
     <property name="password" value="..." /> 
     <property name="username" value="..." /> 


<!--  Configuration pool --> 
     <property name="validationQuery" value="SELECT 1" /> 
     <property name="validationInterval" value="34000" /> 
     <property name="testOnBorrow" value="true" /> 
     <property name="removeAbandoned" value="true" /> 
     <property name="removeAbandonedTimeout" value="55" /> 


    </bean> 

Но я в конечном итоге получаю сообщение об ошибке validationInterval:

несколько аннотаций, найденные на этой линии: - Нет сеттер найдено свойства «validationInterval» в классе «org.apache.commons.dbcp.BasicDataSource»

+0

Вы можете оставить код? – adelmo00

+1

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

+0

Я думаю, что проблема заключается в конфигурации сервера tomcat, поскольку @Gergely Bacso говорит – Kunal

ответ

0

Ответ на моем редактирование, который должен был добавить следующее в моих бобах, которые имеют данные соединения:

<!--  Configuration pool --> 
     <property name="validationQuery" value="SELECT 1" /> 
     <property name="validationInterval" value="34000" /> 
     <property name="testOnBorrow" value="true" /> 
     <property name="removeAbandoned" value="true" /> 
     <property name="removeAbandonedTimeout" value="55" /> 

Я не знаю, почему, но ответ @ Paweł Głowacz не работал для меня. Спасибо за помощь, ребята

2

Без StackTrace это трудно сказать наверняка, но вы скорее всего, связаны с устаревшими соединениями БД. Hibernate не может начать транзакцию для вас, потому что первый оператор пытается запустить ("START TRANSACTION - через JDBC) терпит неудачу снова, я полагаю, что из-за лежащий в основе соединения DB получил недействительна в то же время

Это может.. произойти из-за различных причин:

  • настройки БД (скорее всего)
  • сети/брандмауэр
  • локальные настройки и т.д.

Независимо от источника, у вас есть возможность убедиться, что этого не происходит. Если вы используете пул JDBC (например, Tomcat JDBC pool), вы можете настроить пул для проверки и повторного открытия соединений, если это необходимо. Например, параметр testOnBorrow должен проинструктировать пул постоянно тестировать соединение db, прежде чем предлагать его в приложении для использования. Вы можете точно настроить эти параметры, чтобы устранить проблемы, связанные с производительностью.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Вы пытаетесь осуществить объединение штраф, но вы получили имя переменной: validationInterval неправильно.

Вы получаете эту ошибку, потому что у BasicDataSource нет такой переменной, которая называется так, поэтому Spring не может установить свойство. Взгляните на javadoc BasicDataSource (link), чтобы узнать, какие параметры конфигурации доступны для вас. Переменная validationInterval может применяться к реализации пула tomcat (что я предложил выше), тот, который вы выберете, не имеет этой функции.

+0

Я согласен с вашим ответом, но я не знаю, как его настроить ... я нашел эту ссылку, но я не могу понять, как настроить testOnBorrow на tomcat 7. вы можете объяснить? thanks – Kunal

+1

Конфигурация в основном зависит от существующей конфигурации источника данных. Покажите нам, что у вас есть прямо сейчас, и я могу, вероятно, указать вам правильную документацию, чтобы объединить ее. –

1

Заменить

<property name="validationQuery" value="SELECT 1" /> 
<property name="validationInterval" value="34000" /> 
<property name="testOnBorrow" value="true" /> 
<property name="removeAbandoned" value="true" /> 
<property name="removeAbandonedTimeout" value="55" /> 

С этим:

<property name="initialSize" value="10" /> 
<property name="maxActive" value="5" /> 
<property name="maxWait" value="5000" /> 
+0

Я собираюсь проверить настройки, и в понедельник я дам вам знать, какой из них работал. Спасибо и @Gergely Bacso – Kunal

+2

Эта замена «решит» проблему, это обязательно (она устраняет неисправный параметр validationInterval). Хотя кажется странным, что вы предлагаете заменить один набор кажущейся случайной конфигурации другим набором случайных свойств. Я думаю, что каждый должен прочитать документацию, чтобы узнать смысл записей конфигурации. Они могут иметь совершенно неожиданные эффекты, если их неправильно установить. –

Смежные вопросы