ResultSet et Statement.close()
Bonjour,
Dans une classe java, je boucle 500 fois sur un Statement.executeQuery() qui envoit des select vers une base Oracle. L'ennui est que je dépasse très vite le nombre de cursors ouverts maxi autorisés dans ma base pour une session Oracle( paramètre init.ora MAXI_OPEN_CURSORS : 300 ) car la classe ne fait pas Statement.close() après chaque passage dans la boucle.
Une solution serait donc de faire un Statement .close() après chaque passage mais on dirait que le close() ferme aussi le ResultSet généré précédemment par le Statement.executeQuery(). Est ce que cela fonctionne comme ça ? Si oui, comment éviter de fermer le ResultSet ?
En espèrant avoir été clair, merci d'avance
Re: ResultSet et Statement.close()
Salut,
Citation:
Envoyé par marti
Une solution serait donc de faire un Statement .close() après chaque passage mais on dirait que le close() ferme aussi le ResultSet généré précédemment par le Statement.executeQuery(). Est ce que cela fonctionne comme ça ?
Oui cela fonctionne bien comme cela.
Citation:
Envoyé par marti
Si oui, comment éviter de fermer le ResultSet ?
Au contraire tu dois le fermer, sinon ton problème restera le même...
En général on parcours le ResultSet pour y recopier les informations dans une liste, afin de le réutiliser plus tard...
Par exemple si TableRow correspond à une classe représentant ta table SQL, tu peux faire le mapping avec quelque chose du genre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public List<TableRow> getAllRowFromTable(Connection con) throws SQLException {
List<TableRow> list = new ArrayList<TableRow>();
Statement st = con.createStatement();
try {
ResultSet rs = st.executeQuery("select * from table");
try {
while (rs.next()) {
TableRow row = new TableRow();
row.setValue( rs.getString("value") );
// pour tous les elements de ta table.
list.add(row);
}
} finally {
rs.close();
}
} finally {
st.close();
}
return list;
} |
A noter que cela sera grandement simplifié par Java 6 et les annotations : Mustang, JDBC 4.0 et les Annotations
a++