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 Community Forums のいくつかの投稿をチェックして、「testWhileIdle」や「validationQuery」などのプロパティを持つ commons-dbcp で DataSource を実装しました。アプリを実行したままにして、午前中にもう一度確認します。結果のアップデートを投稿します。
更新#2:
dbcp-commons BasicDataSource を使用すると、ネットワークの問題であると思われるこの問題が修正されるようです。Websphere にはプールされた接続があり、AS400 側でネットワークの問題が発生した場合は、その接続を使用しようとしますが、それが「古い」ことを認識していません。時間間隔を指定して validationQuery を使用することは、この問題を解決する安価な (しかし効率的な) 方法ですが、Websphere 側で構成するより良い方法があるかもしれません。しかし、壊れていないものは変更しない方がよいので、これが失敗するまでは、おそらくこれが今後の解決策になるでしょう。