1

アラートシステムのデータベース内のクエリにアクセスするための基本的なコードに取り組んでいます。稼働中のデータベース(Oracleベース)が自動的に接続プールを作成することを理解しています。接続し、クエリを実行し、 5〜15秒ごとに接続を閉じると、パフォーマンスが大幅に低下するかどうかを知りたいと思いました。これが正しい方法でした。それとも、無限ループが閉じるまで接続を開いたままにする必要がありますか?

接続を閉じるとデータベースが毎回クエリを最初から検索する必要があると言っている人がいますが、開いたままにすると、クエリはデータベースのどこかのキャッシュに保存されます。

     ResultSet rs1 = MyStatement.executeQuery(QUERY_1);
     while (rs1.next()){
     // do something
     }
     rs1.close();

     rs1 = MyStatement.executeQuery(QUERY_2);
     while (rs1.next()){
     // do something
     }
     rs1.close();
4

3 に答える 3

2
  1. Oracleは接続をプールできません。これはクライアント側で行う必要があります

  2. 投稿したコード例では、接続を閉じていません

  3. 接続を開くのはかなり遅いプロセスなので、接続の固定セット(通常、セットはファットクライアントアプリケーションなどのサイズ1)または接続プールを使用して、開いている接続をプールして再利用します。接続プールの実行可能なオプションについては、この質問を参照してください。JDBCを使用した接続プールオプション:DBCPとC3P0アプリケーションサーバーで実行している場合は、接続プールソリューションがすでに提供されている可能性があります。ドキュメントを確認してください。

  4. コード内の結果セットや接続(コード内ではない)などを閉じるには、finallyブロックで実行する必要があります。クロージングを行う(そして必要な例外処理を正しく行うのは実際にはかなり難しい。SpringのJdbcTemplate(http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ )のようなものを使用することを検討してください。 jdbc.html

  5. VPN(仮想プライベートデータベース)などを使用していない場合、Oracleは、ステートメントが同じ接続からのものであるかどうかに関係なく、ステートメントの実行プランをキャッシュします。また、最近アクセスされたデータはメモリに保持され、同様のデータにアクセスするクエリを高速化します。したがって、パフォーマンスの低下は、実際には接続を確立するための遅延が原因です。理論的には完全なデータベースのパフォーマンスに影響を与える可能性のある接続を作成するためのDB側のオーバーヘッドがありますが、それは無関係である可能性があります。

于 2013-03-03T11:09:56.207 に答える
1

クライアントがデータベースに接続するたびに、その接続を認証する必要があります。これは明らかにオーバーヘッドです。さらに、データベースリスナーは、限られた数の接続のみを同時に処理できます。同時接続の試行回数がそのしきい値を超えると、キューに入れられます。これもオーバーヘッドです。

したがって、一般的な答えは、はい、接続の開閉はコストのかかる操作です。

于 2013-03-03T11:00:42.820 に答える
0

特にJavaEEアプリサーバーを使用している場合は、DB接続プールを使用することが常に有益です。また、Java EEアプリサーバーですぐに使用できる接続プールを使用するのが最適です。これは、アプリサーバー開発チームによって最適化され、パフォーマンスがテストされるためです。

于 2013-03-03T10:32:35.680 に答える