0

ファイル内の大量のデータを処理し、このデータをデータベースに入れるアプリケーションがあります。シングルスレッドです。そのため、データベース接続を作成し、その接続で準備済みステートメントを作成し、データの処理中にこれらのステートメントを再利用します。何千ものファイルを処理し、同じ準備済みステートメントを何度も再利用できますが、値を更新するだけです。これはうまく機能していますが、...

ファイルの処理に時間がかかりすぎているところまで来ており、すべて独立しているので、並行して処理したいと考えています。問題は、各ファイルが、たとえば 10 個の準備済みステートメントを使用する可能性があることです。そのため、ファイルごとに新しいデータベース接続を作成し (それらはプールされていますが)、これらの 10 個の準備済みステートメントを設定し、それらを閉じてファイルごとに接続を切断しています。そのため、これは 1 回だけではなく、何千回も発生しています。

実際にタイミングを行ったことはありませんが、この接続と準備されたステートメントの使用が最善の方法であるかどうかに興味がありますか? これらの準備済みステートメントを何度も何度も設定するのは本当にコストがかかりますか? これを行うより良い方法はありますか?スレッド間で接続を共有したくないと読んだことがありますが、私が考えていなかったより良い解決策があるでしょうか?

4

2 に答える 2

0

C3P0 API を使用することをお勧めします http://www.mchange.com/projects/c3p0/ を確認してください

パフォーマンスの向上は、特にクライアント アクセスごとにプールされていない接続を取得する場合の接続およびステートメント プーリングの目的です。これが c3p0 ライブラリの主要な目標です。

この部分は、スレッドと高負荷に関する C3P0 Doc からの抜粋です。

numHelperThreads と maxAdministrativeTaskTime は、DataSource スレッド プールの動作を構成するのに役立ちます。デフォルトでは、各 DataSource には関連付けられたヘルパー スレッドが 3 つだけあります。高負荷時にパフォーマンスが低下するように思われる場合、または JMX または PooledDataSource の直接検査を介して「保留中のタスク」の数が通常 0 より大きいことを確認した場合は、numHelperThreads を増やしてみてください。maxAdministrativeTaskTime は、タスクが無期限にハングし、「APPARENT DEADLOCK」メッセージが表示される場合に役立ちます。

さらに、user Executorand ExecutorServicein (java.util.concurrent) でスレッドをプールすることをお勧めします。

次のようになります。

Executor executor = Executors.newFixedThreadPool(int numberOfThreadsNeeded);
// Executor executor =Executors.newCachedThreadPool(); // Or this one

executor.execute(runnable);
.
.
.
etc
于 2013-04-23T21:22:32.337 に答える
0

この接続と準備済みステートメントの使用が最善の方法である場合は? これらの準備済みステートメントを何度も何度も設定するのは本当にコストがかかりますか?

接続と準備済みステートメントを何度も再利用できます。それらを再作成する必要はなく、接続のために毎回データベース サーバーに再接続する必要はありません。少なくともデータベース接続プールを使用する必要があります。また、同時に複数のスレッドで準備済みステートメントを使用することはできません。また、ほとんどのデータベース接続では、同じ接続を異なるスレッドで使用することはできないと思います。

とはいえ、スレッドではなくデータベースサーバーの IO によって制限されることが多いため、データベースコードをスレッド化しても速度の向上は最小限に抑えられるため、プロファイラーを実行することは理にかなっています。クエリと挿入とトランザクションを混在させている場合、これは正しくない可能性があります。データベースへのリモート接続を行っている場合、ある程度の同時実行性が得られる可能性があります。

データベース操作の速度を向上させるには、大量のトランザクションの前に自動コミットをオフにするか、可能であればリクエストをバッチ処理することを検討してください。

于 2013-04-23T21:01:24.563 に答える