【问题标题】:Spring jdbcTemplate is stuck at Fetching JDBC ConnectionSpring jdbcTemplate 卡在 Fetching JDBC Connection
【发布时间】:2015-07-07 18:00:01
【问题描述】:

我遇到了 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

感谢任何帮助

【问题讨论】:

  • 你能连接其他SQL客户端吗(比如命令行客户端)?
  • 是的。我应该提到这一点。我的其他查询在到达失败的这行代码之前执行良好。
  • 尝试将 maxActive 属性增加到 100。您的初始连接可能会被 JDBC 用于执行测试连接和/或其他查询。看看是不是这样。我还建议您以块的形式获取数据,这样就不会花费太多时间来获取数据。

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


【解决方案1】:

会不会是JDBC连接池耗尽,线程在等待连接?您是否有其他线程或事务使用相同的数据源?

检查连接池是否耗尽添加

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

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

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

【讨论】:

  • 谢谢。我今晚会试试这个解决方案。
  • 我将 maxWait 添加到属性中。问题仍然存在。我假设连接在这里不是问题,它能够连接但需要时间来执行查询。我添加了 jdbcTemplate().setQueryTimeout(3) 但它没有帮助。我担心的是 jdbcTemplate 在获取 JDBC 连接后没有记录任何内容。
  • 然后我会调试有问题的代码部分,并使用调试器深入 Spring 的 JdbcTemplate 代码,以检测 JDBC 模板中的哪个方法被阻塞。
  • 谢谢。我会试试的。
  • 我也有同样的问题。它在我的开发环境中工作。但不适用于 UAT 设置。开发环境是windows,UAT是Linux。
猜你喜欢
  • 2017-03-01
  • 2021-11-29
  • 2014-11-11
  • 2022-12-01
  • 2015-06-01
  • 2015-02-20
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
相关资源
最近更新 更多