Как справиться: сбой линии связи - PullRequest
4 голосов
/ 18 ноября 2008

Мы используем 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 при настройке. Но с тем же успехом не может изменить то, что не сломано, поэтому, пока это не сработает, это, вероятно, будет нашим решением в будущем.

1 Ответ

1 голос
/ 18 ноября 2008

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

...