2012-05-09 38 views
5

Javadoc dice para .close() del PreparedStatement dice que ..Relación entre "cerrar" para PreparedStatement y Connection?

lanzamientos base de datos de este objeto Statement y recursos JDBC de inmediato en lugar de esperar que esto suceda cuando se cierra automáticamente. En general, es una buena práctica liberar los recursos tan pronto como haya terminado con ellos para evitar el bloqueo de los recursos de la base de datos .

Llamar al método cerca de un objeto Statement que ya está cerrado no tiene ningún efecto.

Nota: Cuando se cierra un objeto Statement, también se cierra su objeto ResultSet actual, si existe alguno.

Consideremos el siguiente escenario

MyConnector databaseConnector = DBManager.instance().getConnector(); 

    Connection con = databaseConnector.getConnection(); // returns java.sql.Connection 
    PreparedStatement pstmt = null; 

    try { 
     pstmt = con.prepareStatement("some query"); 
     ... 
    } finally { 
     if (pstmt != null) 
      pstmt.close(); 
    } 

En este ejemplo, se pstmt.close() también cerca con?

+0

No. Cerrar una declaración * no * cerrará la conexión (ya que puede haber * muchas * declaraciones para una sola conexión). La conexión debe * también * considerarse un recurso administrado. –

+2

Siempre puede probar esto con "con.isClosed()" http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html –

Respuesta

9

Cerrando un Statementno cerrar a Connection. Sin embargo, cerrando un Connection cerrará un Statement.

Piense en ello de esta manera:

  • conexión -> crea y se cierra automáticamente -> Declaración
  • Declaración -> crea y se cierra automáticamente -> conjunto de resultados

Así cerrar una Connection se cerrar automáticamente cualquier Statement s y cualquier ResultSet s que contenga.

Sin embargo, todavía se considera mejor práctica cerrar los tres manualmente (ResultSet seguido de Statement seguido de Connection) si es posible.

2

Nota: Cuando un objetoDeclaración está cerrada, su actual conjunto de resultados [pero no la conexión] objeto, si es que existe, está también cerrada.

No cerrará la conexión, solo cierra el objeto de conjunto de resultados.

0

Si está utilizando Java 7 y try-with-resources que no es necesario que preocuparse de cerrar la conexión o cualquiera de los Statement o ResultSet.

try (Connection conn = databaseConnector.getConnection(); 
    PreparedStatement pstmt = conn.prepareStatement("some query")) { 
    ... 
} catch (Exception e) { 
    ... 
} 
+0

Buen punto.Desafortunadamente todavía estoy en 1.6 (por ahora) – JAM

Cuestiones relacionadas