Мы используем Spring 2.5.4 / Hibernate 3.2 / Websphere Application Server 6.1.0.17. Мы развернули приложение на AIX box. На следующий день, когда я захожу, я пытаюсь войти в приложение. Я получаю это исключение на странице:
Error 500: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: could not execute query; nested exception is org.hibernate.exception.JDBCConnectionException: could not execute query
Я проверил System.Out журналы и вижу дальнейшие детали (Использовал pastebin, потому что форматирование журнала действительно испортило макет страницы)
Строка нашего кода, которая вызывает наше исключение:
List loginList = getHibernateTemplate().find("from Login
where storeId =" + id + " and password ='" + password + "'");
Мы подключаем соединение в приложении SpringContext.xml. Нам известно, что время от времени соединение с AS400 прерывается (они могут перезапустить систему за ночь - я не уверен). Тем не менее, мы не хотели бы открывать новое соединение, когда мы подключаем все в applicationContext.
Эта проблема возникает независимо от использования DataSource / JNDI или JDBC
Кто-нибудь знает какие-либо настройки, которые нужно добавить в Spring или Hibernate, чтобы проверить, устарело ли соединение, и если да, сбросьте его и создайте новое? Или какие-либо другие идеи, чтобы решить эту проблему? Дайте мне знать, если вам нужна дополнительная информация / код.
Очень ценится,
Chris
Обновление:
Изучил несколько сообщений на форумах сообщества Spring, и я реализовал свой DataSource с помощью commons-dbcp, который имеет некоторые свойства, такие как 'testWhileIdle' и 'validationQuery'. Я собираюсь оставить приложение запущенным и проверить его снова в AM. Выложу обновление по результатам.
Update # 2:
Использование dbcp-commons BasicDataSource, похоже, исправляет эту проблему, которая, по-видимому, является проблемой сети. Websphere имеет объединенные соединения, и если на стороне AS400 возникнет проблема с сетью, он попытается использовать имеющееся у него соединение, которое он не знает как «устаревшее». Использование validationQuery с временным интервалом - это дешевый (но эффективный) способ решения этой проблемы, но может быть лучший способ на стороне Websphere при настройке. Но с тем же успехом не может изменить то, что не сломано, поэтому, пока это не сработает, это, вероятно, будет нашим решением в будущем.