Что делать: сбой канала связи

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


person Chris Serra    schedule 18.11.2008    source источник


Ответы (1)


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

person Chochos    schedule 18.11.2008