4

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 側で構成するより良い方法があるかもしれません。しかし、壊れていないものは変更しない方がよいので、これが失敗するまでは、おそらくこれが今後の解決策になるでしょう。

4

1 に答える 1

1

ああ、それは私が言おうとしていたことです...問題は、接続を返す前に検証することにより、接続プールで解決する必要があります。DBCP には validationQuery があり、JBoss にも同様のものがあります。Websphere は、接続を配布する前に接続を検証するために、接続プールに同様のものを持っている必要があると確信しています。testWhileIdle を使用しない場合でも、接続が無効であることが判明した場合は、新しい接続が作成され、無効な接続の代わりにプールによって渡されます。

于 2008-11-18T19:25:37.877 に答える