質問

Spring 2.5.4 / Hibernate 3.2 / Websphere Application Server 6.1.0.17を使用しています。 AIXボックスにアプリケーションをデプロイしました。私が入った翌日、私はアプリケーションにログインしようとします。ページでこの例外が表示されます:

エラー500:要求処理が失敗しました。ネストされた例外はorg.springframework.dao.DataAccessResourceFailureException:クエリを実行できませんでした。ネストされた例外はorg.hibernate.exception.JDBCConnectionException:クエリを実行できませんでした

System.Out のログを確認し、詳細を確認しました。 (ログの書式設定が実際にページレイアウトを台無しにしていたため、ペーストビンを使用しました)


例外の原因となっているコードの行は次のとおりです。

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でデータソースを実装しました。アプリを実行したままにして、AMで再度確認します。結果の更新を投稿します。

更新#2:

dbcp-commons BasicDataSourceを使用すると、ネットワークの問題と思われるこの問題が修正されるようです。 Websphereは接続をプールしており、AS400側にネットワークの問題がある場合は、所有している接続を使用しようとしますが、「古い」ことがわかりません。時間間隔でvalidationQueryを使用することは、この問題を解決するための安価な(しかし効率的な)方法ですが、構成の下でWebsphere側により良い方法があるかもしれません。しかし、壊れていないものを変更しないようにすることもできます。そのため、これが失敗するまで、おそらく私たちのソリューションが進むでしょう。

役に立ちましたか?

解決

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top