1

私のWebアプリケーションでは、休止状態と春を使用しています。HibernateSessionFactoryオブジェクトは、Tomcat サーバーの起動時に Spring Bean として注入されます。通常は問題なく動作しています。しかし、データベースをシャットダウンしたり、再起動したりすると、問題が発生します。

HibernateSessionFactoryオブジェクトからセッションを取得し、クエリを実行したい場合、データベースを再起動した後、取得していますorg.hibernate.exception.JDBCConectionException: Could not execute query exception。この問題を解決するには、Tomcat サーバーを再起動する必要があります。再起動後、新しいSessionFactoryオブジェクトが作成されるため、例外は発生しません。

ある状況では、サーバーを何度も再起動する必要がないように、データベースとの新しい新しい接続を取得するにはどうすればよいですか。

4

2 に答える 2

1

SessionFactory の再構築がうまくいきました

私たちのアプリはTomcat、hibernate(3.5.1)、およびOracle dbを使用しています(実際には2つのインスタンスがあります.1つはアプリケーションのメインで、2つ目はリモートです)。各呼び出しで例外が発生した後、リモートdbが再起動することがあります

JDBCConnectionException:could not execute query
Caused by: SQLRecoverableException: No more data to read from socket

最初に設定に追加しました

hibernate.dbcp.validationQuery=select 1 from dual
hibernate.dbcp.testOnBorrow=true
hibernate.dbcp.testOnReturn=true

しかし結果なし。

次に、セッションを閉じて再作成しようとしました。最後に私にとって何がうまくいったか - この例外の後 sessionFactory recreate

sessionFactory.close();
sessionFactory = annotationConfiguration.buildSessionFactory();
于 2013-03-27T10:35:52.217 に答える
0

これは実際にはSpringやHibernateに関連していません。あなたがする必要があるのは、接続を必要とする人(例えばHibernate)に接続を返す前に接続をテストするようにJDBC接続プールをセットアップすることです。プール内の接続が切断されていることをプールが検出すると、プールはそれを破棄し、プールから別の接続を試行します。プール内のすべての接続が切断された場合、プールは新しい接続を作成しようとします。すべてが透過的であり、アプリケーションは気付くことさえありません。

どの接続プールを使用しますか?ndに設定されたdbcp、 :、およびを設定することを検討してください。については、ドキュメントを確認してください。validationQuery"SELECT 1"testOnBorrow=truetestOnReturn=truetestWhileIdle=true

于 2012-04-21T15:48:36.100 に答える