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

时间:2012-10-25 19:50:35

标签: java multithreading spring 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" />

在同一个项目中,我还与数据库建立了连接,使用dbcp.BasicDataSource。

我已经读过,当你的应用程序是单线程的,而不是多线程的时候,DBCP很有效。使用执行器告诉我该应用程序是多线程的。你认为这里使用DBCP不合适吗?这是一个好习惯吗?或者,我生活在一个古老的神话中,DBCP无法处理多种环境?

任何正确方向的指导都将受到赞赏。

1 个答案:

答案 0 :(得分:4)

  

我已经读过,当你的应用程序是单线程的,而不是多线程的时候,DBCP很有效。

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

  

DBCP无法处理多线程环境?

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

所以...我们主要在多线程应用程序中使用连接池,特别是在线程数远大于可用连接数且线程相互竞争的情况下。每个理智的连接池都能够在多线程环境中工作。