Spring jdbcTemplate停留在Fetching JDBC Connection

时间:2015-04-28 18:17:17

标签: spring log4j spring-jdbc jdbctemplate apache-commons-dbcp

我遇到了spring jdbcTemplate的问题。它过去工作正常但现在它没有返回任何值既不是错误消息。我的桌子大小已经增长了很多,大约有3500万条记录,这可能就是原因。

但我主要担心的是jdbcTemplate没有抛出任何异常,也没有将控件释放到下一行代码而我的应用程序中断了。 如果由于某种原因它无法执行查询操作,我希望jdbcTemplate释放连接。下面是我在启用调试日志后从log4j获取的代码,数据源详细信息和日志语句。获取JDBC连接后不会记录任何内容。

SqlRowSet oRs = jdbcTemplate.queryForRowSet(strSql, new Object[] { Integer.valueOf(1) });

数据源配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:4928/dbtest" />
        <property name="username" value="root" />
        <property name="password" value="" />
        <property name="removeAbandoned" value="true" />
        <property name="initialSize" value="3" />
        <property name="maxActive" value="10" />
    </bean>
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource">
            <ref local="dataSource" />
        </property>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="sendMail" class="com.app.SendMails">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>
    <bean id="response" class="com.app.BuildResponses">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>
</beans>

日志:

DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - Executing prepared SQL statement 
DEBUG [org.springframework.jdbc.datasource.DataSourceUtils] - Fetching JDBC Connection from DataSource

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

可能是JDBC连接池耗尽且线程正在等待连接吗?您是否有其他使用相同数据源的线程或事务?

要检查连接池是否已耗尽,请添加

<property name="maxWait" value="1000"/>

到您的 dataSource bean定义。如果无法在1秒(1000毫秒)的超时时间内分配连接,则会出现异常。

除非指定超时,否则BasicDataSource会在从池中借用连接时永远等待。