Мы используем Spring 2.5.4/Hibernate 3.2/Websphere Application Server 6.1.0.17. Мы развернули приложение в системе AIX. На следующий день при входе пытаюсь войти в приложение. Я получаю это исключение на странице:
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 + "'");
Мы подключаем соединение в Spring applicationContext.xml. Мы знаем, что соединение на AS400 время от времени обрывается (они могут перезапустить систему ночью - я не уверен). Однако желательно не открывать новое соединение, когда мы подключаем все в applicationContext.
Эта проблема возникает независимо от использования DataSource/JNDI или JDBC.
Кто-нибудь знает какие-либо настройки, которые можно добавить в Spring или Hibernate, чтобы проверить, не устарело ли соединение, и если да, то удалить его и создать новое? Или есть другие идеи по решению этой проблемы? Дайте мне знать, если вам нужна дополнительная информация/код.
Очень признателен,
Крис
Обновлять:
Просмотрел некоторые сообщения на форумах сообщества Spring, и я реализовал свой источник данных с помощью commons-dbcp, который имеет некоторые свойства, такие как «testWhileIdle» и «validationQuery». Я оставлю приложение запущенным и проверю его еще раз утром. Выложу обновление по результатам.
Обновление №2:
Использование dbcp-commons BasicDataSource, по-видимому, решает эту проблему, которая, по-видимому, связана с сетью. Websphere имеет пул соединений, и если на стороне AS400 возникает проблема с сетью, он попытается использовать имеющееся у него соединение, о котором он не знает, что оно «устарело». Использование validationQuery с временным интервалом является дешевым (но эффективным) способом решения этой проблемы, но может быть лучший способ на стороне Websphere при настройке. Но с таким же успехом можно не менять то, что не сломано, поэтому, пока это не сработает, это, вероятно, будет нашим решением в будущем.