2

EntityManager(TopLink Essentials)を介して多数のネイティブSQLクエリを実行する長時間実行メソッドがあります。各クエリの実行には数ミリ秒しかかかりませんが、何千ものクエリがあります。これは、単一のEJBトランザクション内で発生します。15分後、データベースは接続を閉じ、次のエラーが発生します。

Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b02-p04 (04/12/2010))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Closed Connection
Error Code: 17008
Call: select ...
Query: DataReadQuery()
at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:319)
.
.
.
RAR5031:System Exception.
javax.resource.ResourceException: This Managed Connection is not valid as the phyiscal connection is not usable
at com.sun.gjc.spi.ManagedConnection.checkIfValid(ManagedConnection.java:612)

JDBC接続プールで設定is-connection-validation-required="true"connection-validation-method="table"ましたが、これは役に立ちませんでした。

この種のエラーを正確に処理するために、JDBC接続の検証があると思いました。また、TopLink拡張機能(http://www.oracle.com/technetwork/middleware/ias/toplink-jpa-extensions-094393.html)で何らかのタイムアウト設定を確認しましたが、何も見つかりませんでした。TopLinkセッション構成ファイル(http://download.oracle.com/docs/cd/B14099_19/web.1012/b15901/sessions003.htm)もありますが、そこにも有用なものはないと思います。

Oracle DBAテーブルにアクセスできませんが、CONNECT_TIMEプロファイル変数の設定に従って、Oracleは15分後に接続を閉じると思います。

TopLinkまたはJDBCプールを作成して、閉じた接続を再確立する他の方法はありますか?

データベースはOracle10g、アプリケーションサーバーはSunGlassfish2.1.1です。

4

3 に答える 3

3

すべての JPA 実装 (Java EE コンテナーで実行) は、接続プールが関連付けられたデータソースを使用して、データベースとの接続を管理します。

永続化コンテキスト自体は、 の適切なエントリを介してデータソースに関連付けられていますpersistence.xml。クライアント側で接続タイムアウト設定を変更する場合は、関連する接続プールを再構成する必要があります。

Glassfish では、次のリンクにリストされているように、プール設定を編集することで、接続プールに関連付けられたタイムアウト設定を再構成できます。

サーバー側 (その設定がクライアント設定よりも低い場合、より重要になります) では、Oracle データベースは、ユーザー アカウントに関連付けられたデータベース プロファイルを持つように構成できます。プロファイルのセッションの idle_time および connect_time パラメータは、クライアントとサーバーの相互作用のこの側面で重要なタイムアウト設定を構成します。プロファイルが設定されていない場合、デフォルトでは、タイムアウトは無制限です。

于 2011-05-27T14:09:32.430 に答える
2

connection-validation-method="table"andを設定is-connection-validation-required="true"したようですが、検証対象のテーブルを指定したことについては言及していません。validation-table-name="any_table_you_know_exists"既存のテーブル名 を設定して提供しましたか? validation-table-name="existing_table_name"必要とされている。

接続検証の詳細については、この記事を参照してください

同様の問題に関する関連 StackOverflow 記事- 彼は無効な接続プール全体をフラッシュしたいと考えています。

于 2011-10-21T03:06:09.877 に答える
2

ある種の RAC フェイルオーバーがない限り、接続が終了すると、セッションとトランザクションが終了します。

管理者は、ランナウェイ トランザクションや、単一のジョブがプール内の接続を「独占」するのを防ぐために、いくつかの制限を設定している可能性があります。通常、プール内の接続を長期間ロックすることは望ましくありません。

これらのクエリが必ずしも同じトランザクションの一部ではない場合は、新しい接続を終了して再起動してみてください。

15 分以内に完了するようにコードを再構築できますか。バックグラウンドでストアド プロシージャを使用すると、ネットワークを介して何千もの操作の結果をドラッグするよりもはるかに高速にジョブを実行できる場合があります。

于 2011-05-28T01:00:28.077 に答える