我正在使用 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(...);
仔细阅读后,我找到了 BasicDataSource 的 maxWait
、maxActive
和 maxIdle
属性(来自 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,这样一来它就不会抛出异常。 maxActive
和maxIdle
的默认值为8(我不明白为什么);如果我将它们设置为 -1,则不会再抛出任何异常,并且一切似乎都可以正常工作。
考虑到这个应用程序应该支持大量并发请求,是否可以将这些设置保留为无限?考虑到我收到的错误,Spring 会实际管理我的连接吗?我应该切换到 C3P0 吗?考虑到它有点死了?
最佳答案
DBCP maxWait
参数应以毫秒为单位定义。 30
毫秒的值非常低,请考虑将其增加到 30000
毫秒,然后重试。
关于java - 使用 Spring 和 DBCP 处理 JDBC 连接的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3525529/