【问题标题】:JDBCTemplate hangsJDBCTemplate 挂起
【发布时间】:2012-07-17 13:59:57
【问题描述】:

我正在使用 JDBCTemplate。对于一个特定的查询,JDBCTemplate 在调用超过 3-4 次后挂起,有时在 15-20 次尝试后。我的代码中没有发现任何错误。

private String getXXX(String table)
{
    System.out.println("Test 1");
    final List<String> data = getJdbcTemplate().queryForList(SELECT_TBL_NME,
                new Object[] { table }, String.class);
    System.out.println("Test 2");
    ret = data.size() > 0 ? data.get(0) : null;
    return ret;
}

如果函数被调用超过 15 次,有时甚至在第 3 次或第 4 次调用之后,控制台会在“测试 1”处挂起而没有任何错误。

【问题讨论】:

  • jdbcTemplate使用的dataSource怎么定义?看起来它无法获得与数据库的连接。
  • 我的班级正在扩展 JDBCDaoSupport 和我的 bean <property name="dataSource" ref="DBMetaDataDS"></property>
  • 如果您从除主线程之外的另一个线程运行它,请确保您正确处理错误日志记录。因为它可能是,您的查询只是默默地失败并且您看不到预期的结果

标签: java spring spring-jdbc


【解决方案1】:

问题似乎是您没有关闭连接。

final List data = getJdbcTemplate().queryForList(SELECT_TBL_NME, new Object[] { table}, String.class);

上面的行永远不会结束,因为 JdbcTemplate 正在等待从您的数据库获取连接。

因此,如果您的数据库无法为您提供连接,那么您的应用程序正在等待、等待、等待,并且它对时间没有任何作用。

可能的修复:由于您使用的是 Spring,请检查您是否没有在 queryForList 方法之外进行操作。

几个月前我遇到了同样的问题,因为我在 queryForList 方法之外调用了 ResultSet.getMetaData() 并且没有释放/关闭连接。

【讨论】:

  • 感谢您的回复,但我已经将所有 JDBCtemplete 调用转换为具有适当连接关闭机制的普通 JDBC 并已部署。
【解决方案2】:

问题可能不在 Java 层。

首先尝试检查您的:

  1. DB - 尝试使用 DB 工具(Toad、 sqlplus、SQL Developer 等)并确保数据库正常工作。问题 可能在您的数据库对象上(它可能被其他会话锁定)。

  2. 网络 - 相同的问题可能是由于延迟不佳造成的。确保您的网络运行良好。

  3. 尝试使用普通 JDBC 测试相同的查询。

【讨论】:

  • 感谢infate的回复我正在使用Toad连接oracle 10g,并且在toad端没有这样的问题。我尝试了简单的 JDBC,它可以工作。但是在我的项目中,使用 JDBCTemplete 触发了查询。所以不能转移到普通的 JDBC。我仍然很困惑为什么它没有在 JDBCTemplte 中抛出任何错误
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2016-01-16
  • 2015-07-06
相关资源
最近更新 更多