当前位置: 首页 > 面试题库 >

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

方和豫
2023-03-14
问题内容

我正在使用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(...);

围绕阅读一点点后,我发现了maxWaitmaxActive并且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>

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

无法获得JDBC连接。嵌套的异常是org.apache.commons.dbcp.SQLNestedException:无法获得连接,池错误超时等待空闲对象

有一些长时间运行的查询,但是无论查询的复杂性如何,都会引发异常。

然后,我将maxActive和maxIdle设置为一开始就不会抛出异常。默认值是8 maxActivemaxIdle(我不明白为什么);
如果我将它们设置为-1没有更多抛出异常,一切 似乎 很好地工作。

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


问题答案:

如您所知,默认的dbcp连接池是8个连接,因此,如果要运行9个同时查询,将阻止其中之一。我建议您连接到数据库并运行exec sp_who2,它将向您显示什么已连接,处于活动状态以及是否阻止了任何查询。然后,您可以确认问题是在数据库上还是在代码中。

只要您使用的是Spring的JdbcTemplate系列对象,就可以按期望的方式管理连接,并且,如果要使用原始DataSource,请确保使用DataSourceUtils来获取Connection。

另一个建议-在Spring
3之前,不要使用JdbcTemplate,而要坚持使用SimpleJdbcTemplate,您仍然可以使用SimpleJdbcTemplate.getJdbcOperations()访问相同的方法,但是您应该发现自己使用泛型编写了更好的代码,并消除了需要创建JdbcTemplate
/ NamedParameterJdbcTemplate实例。



 类似资料:
  • 问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使

  • 我试试看。js与mongodb(2.2.2)一起使用本机节点。js drive by 10gen。 起初一切都很顺利。但在并发基准测试部分,出现了很多错误。频繁连接/关闭1000次并发可能会导致mongodb拒绝任何进一步的请求,错误如下: 此外,如果很多客户端在没有显式关闭的情况下关闭,mongodb需要几分钟来检测并关闭它们。这也会导致类似的连接问题。(使用/var/log/mongodb/m

  • 我在我的网络应用程序中使用spring mongo。当我在Tomcat7中取消部署应用程序时,内存泄漏。我怀疑可能是我没有明确关闭的Mongo对象。我想知道关闭它的正确方式(和位置)。

  • 问题内容: 我一直在使用spring-webflux进行一些研究,我想了解使用路由器功能处理错误的正确方法。 我创建了一个小项目来测试几个场景,并且我希望获得有关它的反馈,并查看其他人在做什么。 到目前为止,我在做什么。 提供以下路由功能: 我已经在我的处理程序上执行了 它们是我的错误处理程序: 这是完整的示例存储库: https://github.com/LearningByExample/re

  • 所以,我想实现一个非常简单的输出。 我有与字段成功,消息和列表数据响应类。 和请求类 null null 我试过很多方法,但最后都没能做到。

  • 问题内容: 我遇到这种情况,我需要将a解析为an ,但我不知道该如何处理。当我没有抓住它时,编译器不会抱怨,但是我只是想确保自己能够正确处理这种情况。 我只想这样简化我的代码。编译器没有问题,但是线程在上死掉了。 Google CodePro希望我以某种方式记录该异常,并且我同意这是最佳实践。 我希望当当前片段不是数字或无法解析时返回此方法。当我没有显式捕获时,是否不分配变量?还是有一些默认值返回