EN JP CN

UF.SQLCON

UF.SQLCON

UF (Use Freed) 問題は、リソースが解放された後にリソースを使用する試みがある場合に報告されます。警告 UF.SQLCON は、JDBC 接続が閉じられた後にその接続の使用を試みていることを示します。

例 1

26     public List<String> order() {
27         final List<String> strings = new ArrayList<String>();
28         populate(strings, 1, 3, 5, 7, 9);
29         populate(strings, 0, 2, 4, 6, 8);
30         return strings;
31     }
32 
33     public void populate(List<String> data, int... keys) {
34         try {
35             PreparedStatement ps = conn.prepareStatement("SELECT * FROM Table where key=?");
36             try {
37                 for (int key : keys) {
38                     ps.setInt(1, key);
39                     final ResultSet resultSet = ps.executeQuery();
40                     try {
41                         populate(data, resultSet);
42                     } finally {
43                         resultSet.close();
44                     }
45                 }
46             } catch (SQLException e) {
47                 conn.close();
48             }  finally {
49                 ps.close();
50             }
51         } catch (SQLException e) {
52             // do nothing
53         }
54     }
55 
56     public void populate(List<String> data, ResultSet rs) throws SQLException {
57         while (rs.next()) {
58             String s = rs.getString(1);
59             data.add(s);
60         }
61     }

SQLException がスローされた場合、28 行目で呼び出されているメソッド 'populate' によって JDBC 接続 'conn' が閉じられるため、UF.SQLCON が 29 行目のスニペットに対して報告されます。すなわち、29 行目で次に 'populate' が呼び出されたとき、既に閉じられた接続を使用する試みとなる可能性があります。