具有执行程序或多线程环境的Apache DBCP

A.C*_*A.C 1 java spring multithreading executorservice apache-commons-dbcp

我的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" />
Run Code Online (Sandbox Code Playgroud)

在同一项目中,我还具有使用dbcp.BasicDataSource的数据库连接。

我已经读到DBCP在您的应用程序是单线程而不是多线程时才有效。使用executor告诉我该应用程序是多线程的。您认为在这里使用DBCP是否不合适?这是一个好习惯吗?或者,我是否有一个古老的神话,那就是DBCP无法处理多种环境?

朝着正确方向的任何指导将不胜感激。

Tom*_*icz 5

我已经读到DBCP主要在您的应用程序是单线程而不是多线程时才有效。

您可以提供这些信息的来源吗?DBCP的唯一问题是它使用单锁来同步池上的所有操作,这可能成为繁重的多线程应用程序的瓶颈。

DBCP无法处理多线程环境?

想一想。如果您的应用程序仅是单线程的,则它将永远不会使用多个连接。JDBC处于阻塞状态,因此您不能一次使用同一线程中的两个连接(简化)。话虽如此,如果仅从一个线程查询数据库,则不仅不需要连接池,也不需要DataSource。一个Connection就足够了。

所以...我们主要在多线程应用程序中使用连接池,尤其是在线程数比可用连接数大得多且线程彼此竞争的情况下。每个理智的连接池都可以在多线程环境中工作。