3

我正在使用 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”处挂起而没有任何错误。

4

2 回答 2

3

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

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

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

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

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

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

于 2012-10-17T13:18:27.613 回答
0

问题可能不在 Java 层。

首先尝试检查您的:

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

  2. 网络——同样的问题可能是因为延迟不好。确保您的网络运行良好。

  3. 尝试使用普通 JDBC 测试相同的查询。
于 2012-07-17T14:29:41.490 回答