Ale*_*ian 7 java spring dao connection-pooling jdbc
我正在使用Spring MVC在SQL Server数据库之上构建一个薄层.当我开始测试时,似乎它不能很好地处理压力:).我正在使用Apache Commons DBCP来处理连接池和数据源.
当我第一次尝试~10-15个同时连接时,它曾经挂起并且我必须重新启动服务器(对于dev我正在使用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 -->
Run Code Online (Sandbox Code Playgroud)
这就是我使用它们的方式:
// 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(...);
Run Code Online (Sandbox Code Playgroud)
周围一点点看完后,我发现maxWait,maxActive和maxIdle对性能的BasicDataSource(从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>
Run Code Online (Sandbox Code Playgroud)
首先,我设置maxWait,以便它不会挂起,而是在池中没有可用连接时抛出异常.异常消息是:
无法获得JDBC连接; 嵌套异常是org.apache.commons.dbcp.SQLNestedException:无法获取连接,池错误超时等待空闲对象
有一些长时间运行的查询,但无论查询复杂性如何,都会抛出异常.
然后,我设置maxActive和maxIdle,这样它就不会抛出异常.默认值是8 maxActive和maxIdle(我不明白为什么); 如果我将它们设置为-1,则不会抛出更多异常,一切似乎都能正常工作.
考虑到这个应用程序应该支持大量并发请求,是否可以将这些设置保留为无限?考虑到我收到的错误,Spring会不会真正管理我的连接?考虑到它有点死了,我应该切换到C3P0吗?
正如您已经发现的那样,默认的dbcp连接池是8个连接,因此如果要同时运行9个查询,其中一个将被阻止.我建议您连接到您的数据库并运行exec sp_who2,它将显示连接和活动的内容,以及是否阻止任何查询.然后,您可以确认问题是在数据库上还是在代码中.
只要您使用Spring的JdbcTemplate对象系列,您的连接就会按照您的预期进行管理,如果您想使用原始DataSource,请确保使用DataSourceUtils来获取Connection.
另一个建议 - 在Spring 3之前,不要使用JdbcTemplate,坚持使用SimpleJdbcTemplate,你仍然可以使用SimpleJdbcTemplate.getJdbcOperations()访问相同的方法,但是你应该发现自己使用泛型编写更好的代码,并且不再需要永远创建JdbcTemplate/NamedParameterJdbcTemplate实例.
| 归档时间: |
|
| 查看次数: |
28201 次 |
| 最近记录: |