java - 使用 Spring 和 DBCP 处理 JDBC 连接的正确方法是什么?

标签 java spring jdbc connection-pooling dao

我正在使用 Spring MVC 在 SQL Server 数据库之上构建一个薄层。当我开始测试时,它似乎不能很好地处理压力 :)。我正在使用 Apache Commons DBCP处理连接池和数据源。

当我第一次尝试 ~10-15 个同时连接时,它常常会挂起,我必须重新启动服务器(对于开发人员,我使用的是 Tomcat,但最终我将不得不部署到 Weblogic 上)。

这些是我的 Spring bean 定义:

<bean id="dataSource" destroy-method="close"
      class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="[...]"/>
    <property name="username" value="[...]" />
    <property name="password" value="[...]" />
</bean>

<bean id="partnerDAO" class="com.hp.gpl.JdbcPartnerDAO">
    <constructor-arg ref="dataSource"/>
</bean>

<!-- + other beans -->

这就是我使用它们的方式:

// in the DAO
public JdbcPartnerDAO(DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
}

// in the controller
@Autowired
private PartnerDAO partnerDAO;

// in the controller method
Collection<Partner> partners = partnerDAO.getPartners(...);

仔细阅读后,我找到了 BasicDataSourcemaxWaitmaxActivemaxIdle 属性(来自 GenericObjectPool)。问题来了。我不确定我应该如何设置它们,性能方面。据我所知,Spring 应该管理我的连接,所以我不必担心释放它们。

<bean id="dataSource" destroy-method="close"
      class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="[...]"/>
    <property name="username" value="[...]" />
    <property name="password" value="[...]" />
    <property name="maxWait" value="30" />
    <property name="maxIdle" value="-1" />
    <property name="maxActive" value="-1" />
</bean>

首先,我设置了 maxWait,这样它就不会挂起,而是在池中没有可用连接时抛出异常。异常消息是:

Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

有一些长时间运行的查询,但是无论查询复杂度如何都抛出了异常。

然后,我设置了 maxActive 和 maxIdle,这样一来它就不会抛出异常。 maxActivemaxIdle的默认值为8(我不明白为什么);如果我将它们设置为 -1,则不会再抛出任何异常,并且一切似乎都可以正常工作。

考虑到这个应用程序应该支持大量并发请求,是否可以将这些设置保留为无限?考虑到我收到的错误,Spring 会实际管理我的连接吗?我应该切换到 C3P0 吗?考虑到它有点死了?

最佳答案

DBCP maxWait 参数应以毫秒为单位定义。 30 毫秒的值非常低,请考虑将其增加到 30000 毫秒,然后重试。

关于java - 使用 Spring 和 DBCP 处理 JDBC 连接的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3525529/

相关文章:

java - Mysql Drop Table as PreparedStatement 不适合我

java - Java中的File和FileLoader有什么区别?

java - 将毫秒转换为时间

java - Spring 注解中的动态属性(@ComponentScan)

java - 使用 spring 注解在派生类中设置基类的属性

java - ResultSet.getFloat 返回 0 而不是 NULL

mysql - isValid() 调用永远不会在 MySQL JDBC 连接上返回

java - 枚举作为 Spring Boot Rest 中的请求参数

java - 我的表在使用修改和查询注释时没有映射?

java - 使用 springs getHibernateTemplate,如何获取用户列表并限制结果集?