2013-09-06 3 views
1

Я использую javax.sql.rowset.JdbcRowSet и com.sun.rowset.JdbcRowSetImpl для управления данными. Все работает нормально, но я получаю предупреждение, что я могу получить утечку ресурсов.JDBC RowSets using singleton Connection

Кроме того, я использую singleton Connection в конструкторе JdbcRowSet, который всегда открыт, но когда я использую JdbcRowSet close(), я не могу использовать его в следующем методе.

Вот код.

public static Connection conn = DBConnection.getInstance() 
     .getConnection(); 



(not the exact work, only a sample code) 
private static void function1() { 

    try { 
     JdbcRowSet myrs = new JdbcRowSetImpl(conn); 
     myrs.setCommand("SELECT * FROM `table1`"); 
     myrs.execute(); 

     //result iteration 

     myrs.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 
private static void function2() { 
    same as function1 (for example, not really important here) 
} 

public static void start(){ 
    function1(); 
    function2(); 
} 

Когда он получает выполнить myrs в function2() я получаю сообщение об ошибке:

at com.sun.rowset.JdbcRowSetImpl.execute(Unknown Source)

Любой знает, как решить эту проблему?

+0

Что происходит, если вы дважды выполняете функцию1? –

+0

@FrankOlschewski То же самое, что я выполнил function2. – Ivan

ответ

2

Вот реализация JdbcRowSetImpl тесного

public void close() throws SQLException { 
    if (rs != null) 
     rs.close(); 
    if (ps != null) 
     ps.close(); 
    if (conn != null) 
     conn.close(); 
} 

С JdbcRowSetImpl.close() закрывает соединение, лучший способ, чтобы соответствовать вашей текущей архитектуры может быть создание члена или экземпляра одноплодной JdbcRowSet, который закрывается, когда вы ожидаете, что соединение будет классифицировано. Ваши функции1 и function2 будут выглядеть так:

public static Connection conn = DBConnection.getInstance() 
    .getConnection(); 
//Implementation of DBRowSet left as an exercise for the ambitious. 
public static JdbcRowSet myrs = DBRowSet.getInstance(); 

private static void function1() { 
    try { 
     myrs.setCommand("SELECT * FROM `table1`"); 
     myrs.execute(); 
     //result iteration 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 
private static void function2() { 
    try { 
     myrs.setCommand("SELECT * FROM `table2`"); 
     myrs.execute(); 
     //result iteration 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Не так ли? Это здорово, если это так, мне не нужно беспокоиться об этом! Eclipse получает это предупреждение при создании экземпляра RowSet: 'утечка ресурсов:« myrs »никогда не закрывается». РЕДАКТИРОВАТЬ: Если он будет закрыт, будет ли соединение оставаться в живых позже? – Ivan

+0

Я обновил свой ответ с возможным ответом. JdbcRowset, являющийся Autocloseble, не имеет отношения к вашему делу, потому что вы не используете Java 7. –

+1

Что делать, если я реализую свой собственный класс JdbcRowSet и переопределяю метод 'close()'? Это поможет? – Ivan