Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';使用Spring和DBCP处理JDBC连接的正确方法是什么?_Java_Spring_Jdbc_Connection Pooling_Dao - Fatal编程技术网

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

Java 什么';使用Spring和DBCP处理JDBC连接的正确方法是什么?,java,spring,jdbc,connection-pooling,dao,Java,Spring,Jdbc,Connection Pooling,Dao,我正在使用SpringMVC在SQLServer数据库之上构建一个薄层。当我开始测试时,它似乎不能很好地处理压力:)。我用它来处理连接池和数据源 当我第一次尝试10-15次同时连接时,它通常会挂起,我必须重新启动服务器(对于开发人员,我使用的是Tomcat,但最终我必须在Weblogic上部署) 以下是我的Springbean定义: <bean id="dataSource" destroy-method="close" class="org.apache.commons.db

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

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

以下是我的Springbean定义:

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

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

存在一些长时间运行的查询,但不管查询的复杂性如何,都会引发异常

然后,我设置maxActive和maxIdle,这样它就不会首先抛出异常。
maxActive
maxIdle
的默认值是8(我不明白为什么);如果我将它们设置为-1,则不会抛出更多的异常,而且一切似乎都正常工作


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

让我们换个角度

但异常被抛出 不管查询的复杂性如何

这可能是因为您要查询的表或表中的记录已被锁定(由其他活动事务锁定),因此超时


尝试从SQLServer客户端运行相同的查询,如果需要很长时间,则可以确定是表或记录锁导致了此问题。

正如您已经发现的,默认的dbcp连接池是8个连接,因此如果要同时运行9个查询,其中一个将被阻止。我建议您连接到数据库并运行
exec sp_who2
,它将显示连接的内容、活动的内容以及是否有任何查询被阻止。然后,您可以确认问题是在db上还是在代码中

只要您使用Spring的JdbcTemplate对象系列,您的连接就会得到预期的管理,如果您想使用原始数据源,请确保使用来获得连接


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

DBCP
maxWait
参数应以毫秒为单位定义<代码> 30 < /代码> ms非常低,考虑将其增加到<代码> 30000 <代码> MS,然后再试一次。 如果您遇到任何异常,发布stacktrace将有助于轻松识别问题,是否存在任何长时间运行的问题?我已经用异常消息和一些额外信息更新了我的帖子。我明白您的观点,但当我将数据源的
maxActive
maxIdle
参数设置为一个大值(或无限)时,问题就完全消失了。这使我认为问题来自ConnectionPool,正如异常消息所述。
// 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(...);
<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>