Вопрос

Мы используем 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

Я проверил Система.Выход журналы и просмотрите дополнительную информацию.(Использовал Pastebin, потому что форматирование журнала действительно портило макет страницы)


Строка нашего кода, вызывающая наше исключение:

List loginList = getHibernateTemplate().find("from Login  
    where storeId =" + id + " and password ='" + password + "'");

Мы подключаем соединение в Spring applicationContext.xml.Мы знаем, что соединение на AS400 время от времени обрывается (они могут перезапустить систему ночью - я не уверен).Однако нам бы не хотелось открывать новое соединение, когда мы подключаем все в контексте приложения.

Эта проблема возникает независимо от использования DataSource/JNDI или JDBC.

Кто-нибудь знает какие-либо настройки, которые можно добавить в Spring или Hibernate, чтобы проверить, не устарело ли соединение, и если да, то удалить его и создать новое?Или есть другие идеи по решению этой проблемы?Дайте мне знать, если вам нужна дополнительная информация/код.

Очень признателен,

Крис

Обновлять:

Просмотрел несколько сообщений на форумах сообщества Spring и реализовал свой источник данных с помощью commons-dbcp, который имеет некоторые свойства, такие как «testWhileIdle» и «validationQuery».Я оставлю приложение включенным и проверю его еще раз утром.Опубликую обновленную информацию о результатах.

Обновление №2:

Использование dbcp-commons BasicDataSource, похоже, устраняет эту проблему, которая, по-видимому, является проблемой сети.Websphere имеет пул соединений, и если на стороне AS400 возникнет проблема с сетью, он попытается использовать имеющееся соединение, о котором он не знает, что оно «устарело».Использование запроса validationQuery с временным интервалом — дешевый (но эффективный) способ решить эту проблему, но на стороне Websphere может быть лучший способ при настройке.Но с таким же успехом можно не менять то, что не сломано, поэтому, пока это не потерпит неудачу, это, вероятно, будет нашим решением в будущем.

Это было полезно?

Решение

Ах, вот что я хотел сказать...проблема должна быть решена в пуле соединений путем проверки соединений перед их возвратом.У DBCP есть validationQuery, а у JBoss тоже есть что-то подобное;Я уверен, что в пуле соединений Websphere должно быть что-то подобное для проверки соединений перед их раздачей.Даже если вы не используете testWhileIdle, если соединение окажется недействительным, пул создаст новое и передаст вам вместо недействительного.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top