-1

私はfinallyブロックでcon、rs、stmtを閉じていると確信しています。しかし、更新を実行しようとする4回目の試行で、「接続が多すぎます」というエラーが発生するようです。

public boolean setUserSettings(UserSettings userSettings)
{
    ResultSet rs = null;
    Connection con = null;
    PreparedStatement stmt = null;
    String _query;

    try
    {
        System.out.println("total current connections: " + dataSource.getActive());
        con = dataSource.getConnection();
        _query = Util.readIn("/sql/select/selectUserSettingsCount.sql", MySqlPersistence.class);
        stmt = con.prepareStatement(_query);
        stmt.setString(1, userSettings.user);

        rs = stmt.executeQuery();
        boolean found = rs.next() && rs.getInt(1) == 1;

        if (!found)
        {
            _query = Util.readIn("/sql/insert/setUserSettings.sql", MySqlPersistence.class);
            stmt = con.prepareStatement(_query);
            stmt.setString(1, userSettings.user);
            stmt.setBoolean(2, userSettings.isActive);
            stmt.setString(3, userSettings.phone);
            stmt.setString(4, userSettings.phone2);
            stmt.setString(5, userSettings.phone3);
            stmt.setString(6, userSettings.contact_strategy);
        }
        else
        {               
            _query = Util.readIn("/sql/update/updateUserSettings.sql", MySqlPersistence.class);
            stmt = con.prepareStatement(_query);
            stmt.setString(1, userSettings.phone);
            stmt.setString(2, userSettings.phone2);
            stmt.setString(3, userSettings.phone3);
            stmt.setString(4, userSettings.user);
        }

        int success = stmt.executeUpdate();
        if (found && success == 1)
        {
            return true;
        }
        else
        {                
            return false;
        }
    }
    catch (Exception e)
    {            
        e.printStackTrace();
        return false;
    }
    finally
    {
        try { if (rs != null) System.out.println("closing rs"); rs.close(); } catch (SQLException e) { }
        try { if (stmt != null) System.out.println("closing stmt"); stmt.close(); } catch (SQLException e) { }
        try { if (con != null) System.out.println("closing con"); con.close(); } catch (SQLException e) { }
    }
}
4

1 に答える 1

3

メソッド呼び出しごとに2つのステートメントを作成しますが、閉じるのは1つだけです。最初の大きなifブロックに入る前に、既存のステートメントを閉じる必要があります。

アップデート:

さらに考えてみると、コードに別のエラーがあることに気づきました。このパターンは壊れています:

if (con != null) System.out.println("closing con"); con.close();

実際、これは、ifブロックで常に中括弧を使用する必要がある理由の素晴らしい例です。再フォーマットすると、このコードは次のようになります。

if (con != null) 
    System.out.println("closing con"); 
con.close();

ただし、本当に必要なのは次のとおりです。

if (con != null) {
    System.out.println("closing con"); 
    con.close();
}
于 2013-02-04T16:54:23.930 に答える