Duplicar posibles:
when to close Connection, Statement, PreparedStatement and ResultSet in JDBCBuenas prácticas: JDBC de conexión
He escrito un simple envoltorio para una conexión JDBC y funciona pero quiero mejorarlo con las mejores prácticas como sea posible. Básicamente tiene métodos como open()
, close()
, isOpened()
, select()
, insert()
, update()
, delete()
y batch()
. Por simplicidad, solo publicaré aquí los primeros 4 métodos.
public class Query{
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
//Database.open() returns a Connection ready to use
public void open (Database database) throws DatabaseException, SQLException{
if (!isOpened()){
con = database.open();
}
}
public void close() throws SQLException{
if (isOpened()){
if (ps != null) ps.close();
con.close();
con = null;
}
}
public boolean isOpened(){
return con != null;
}
//The query string is the query without the word "select" and can use placeholders (?)
//The args param it's just an array owith the values of this placeholders
public ResultSet select (String query, Object[] args) throws SQLException{
if (ps != null) ps.close();
if (isOpened()){
ps = con.prepareStatement ("select " + query);
if (args != null){
for (int i=0; i<args.length; i++){
ps.setObject (i+1, args[i]);
}
}
rs = ps.executeQuery();
}
return rs;
}
}
Notas:
- El mismo objeto de consulta pueden ser reutilizados, para la apertura y el cierre de ejemplo ella, y después de abrir de nuevo.
- No estoy cerrando la conexión para cada consulta, sólo estoy cerrando la declaración preparada (esto es correcto o que puede dejar el preparado declaración abrió debido a que el objeto de conexión de la cerrará?)
- Cuando cerrar el
Connection
, todos losPreparedStatement
sy susResultSet
s también están cerrados, ¿verdad?
Uso:
Database database;
//Database initialization
Query query = new Query();
query.open (database);
ResultSet rs = query.select ("* from user where name=?", new String[]{ "MyName" });
doSomethingWithResult1 (rs);
//Connection is not closed here
ResultSet rs = query.select ("coordx from point where coordy=? and coordz=?", new Float[]{ 0.1, 0.2 });
doSomethingWithResult2 (rs);
query.close();
query.open (database);
ResultSet rs = query.select ("* from user where name=?", new String[]{ "MyName" });
doSomethingWithResult1 (rs);
//Connection is not closed here
ResultSet rs = query.select ("coordx from point where coordy=? and coordz=?", new Float[]{ 0.1, 0.2 });
doSomethingWithResult2 (rs);
query.close();
¿Qué opinas? ¿Debo cerrar y abrir la conexión después de cada consulta? ¿Puedo dejar abierto PreparedStatement después de cada consulta en la misma conexión? Es un buen diseño?
Cerrar y volver a abrir las conexiones para cada consulta es una mala idea. Hacer una conexión es realmente, muy caro. – bdares
¿Entonces puedo dejar abierto PreparedStatement o debería cerrarlo para cada consulta? –
Puede dejar todo abierto hasta que termine de usar la base de datos. Al cerrar una conexión se rastreará y cerrará todas las cosas (declaraciones, resultados) que generó. – bdares