2013-09-06 3 views
1

J'utilise javax.sql.rowset.JdbcRowSet et com.sun.rowset.JdbcRowSetImpl pour manipuler des données. Tout fonctionne bien, mais je reçois un avertissement que je pourrais avoir une fuite de ressources.JDBC RowSets utilisant singleton Connexion

En outre, j'utilise singleton Connexion dans le constructeur JdbcRowSet qui est toujours ouvert, mais quand j'utilise JdbcRowSet close() je ne peux pas l'utiliser dans la méthode suivante.

Voici le code.

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(); 
} 

Quand il arrive à exécuter dans myrsfunction2() je reçois une erreur:

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

Tout le monde sait comment le résoudre?

+0

Que se passe-t-il lorsque vous exécutez function1 deux fois? –

+0

@FrankOlschewski La même chose que j'ai exécuté la fonction2. – Ivan

Répondre

2

est ici la mise en œuvre JdbcRowSetImpl de près

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

Depuis le JdbcRowSetImpl.close() fermera la connexion, la meilleure façon d'adapter à votre architecture actuelle pourrait être de créer un singleton membre ou une instance JdbcRowSet qui est fermé lorsque vous attendez que la connexion soit classée. Votre fonction1 et fonction2 ressemblerait à ceci

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

Est-ce? C'est génial si c'est le cas, je n'ai pas besoin de m'inquiéter à ce sujet! Eclipse m'apporte cet avertissement lors de la création d'une instance de RowSet: 'Fuite de ressources: 'myrs' n'est jamais fermé'. EDIT: Si elle est atuoclosable, la connexion restera-t-elle vivante plus tard? – Ivan

+0

J'ai mis à jour ma réponse avec une réponse possible. JdbcRowset étant Autocloseble n'est pas pertinent dans votre cas car vous n'utilisez pas Java 7. –

+1

Et si j'implémente ma propre classe JdbcRowSet et remplace la méthode 'close()'? Cela aidera-t-il? – Ivan