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 が機能していることを確認します。DB オブジェクトに問題がある可能性があります (他のセッションによってロックされている可能性があります)。

  2. ネットワーク - 同じ問題は、遅延が原因である可能性があります。ネットワークが正常に機能していることを確認してください。

  3. プレーンな JDBC で同じクエリをテストしてみてください。
于 2012-07-17T14:29:41.490 に答える