【问题标题】:Apache DBCP with executor or multithreaded environment带有执行器或多线程环境的 Apache DBCP
【发布时间】:2012-10-16 01:57:20
【问题描述】:

我的 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 在您的应用程序是单线程而非多线程时最有效。 executor 的使用告诉我该应用程序是多线程的。你觉得这里使用 DBCP 不合适吗?这是一个好习惯吗?或者,我是否生活在一个古老的神话中,即 DBCP 无法处理多线程环境?

我们将不胜感激任何正确方向的指导。

【问题讨论】:

    标签: java multithreading spring executorservice apache-commons-dbcp


    【解决方案1】:

    我了解到 DBCP 在您的应用程序是单线程而非多线程时最有效。

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

    DBCP 不能处理多线程环境?

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

    所以...我们主要在多线程应用程序中使用连接池,尤其是在线程数量远大于可用连接数量并且线程之间相互竞争的情况下。每个健全的连接池都能够在多线程环境中工作。

    【讨论】:

    • 你好,我自己也在探索这个。我找不到任何在 Java 上使用多线程连接池的好的教程。我计划为每个线程 .java 应用程序创建一个连接,但我无法开始。
    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多