1

services.xmlに次のコードがあります

<bean id="executorService" class="java.util.concurrent.Executors" factory-method="newFixedThreadPool">
    <constructor-arg value="10" />
</bean>
<task:annotation-driven executor="executor" />

<task:executor id="executor" pool-size="10" queue-capacity="100" rejection-policy="CALLER_RUNS" />

同じプロジェクトで、dbcp.BasicDataSourceを使用するデータベースへの接続もあります。

DBCPは、アプリがマルチスレッドではなくシングルスレッドの場合に主に効果的であることを読みました。エグゼキュータを使用すると、アプリがマルチスレッドであることがわかります。ここでのDBCPの使用は適切ではないと思いますか?これは良い習慣でしょうか?または、DBCPはマルチハード環境を処理できないという古くからの神話を生きていますか?

正しい方向へのガイダンスをいただければ幸いです。

4

1 に答える 1

5

DBCPは、アプリがマルチスレッドではなくシングルスレッドの場合に主に効果的であることを読みました。

この情報のソースを提供できますか?DBCPの唯一の問題は、単一のロックを使用してプール上のすべての操作を同期することです。これは、重いマルチスレッドアプリケーションのボトルネックになる可能性があります。

DBCPはマルチスレッド環境を処理できませんか?

考えてみてください。アプリケーションがシングルスレッドのみの場合、複数の接続を使用することはありません。JDBCがブロックしているため、同じスレッドから2つの接続を同時に使用することはできません(簡略化)。そうは言っても、1つのスレッドからデータベースをクエリするだけの場合は、接続プールが必要ないだけでなく、も必要ありませんDataSource。1つConnectionで十分です。

つまり...私たちは主にマルチスレッドアプリケーションで接続プールを使用しています。特に、スレッドの数が利用可能な接続の数よりもはるかに多く、スレッドが互いに競合している場合です。すべての正常な接続プールは、マルチスレッド環境で機能します。

于 2012-10-25T20:00:31.813 に答える