2012-05-13 14 views
5

Duplicar posibles:
Why would you ever implement finalize()?¿Está cerrando la conexión para finalizar la práctica recomendada?

vi algunos archivos de Java con el siguiente código:

public void finalize() { 
    if (conn != null) { 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
     } 
    } 
} 
  • está cerrando un Connection en la mejor práctica finalize método?
  • ¿Es suficiente cerrar el Connection o también hay que cerrar otros objetos como PreparedStatement?
+0

Según [Effective Java] (http://www.informit.com/articles/article.aspx?p=1216151&seqNum=7) - la mejor práctica es 'Evitar finalizadores ' – tenorsax

+0

Puede encontrar [¿Qué debo cerrar primero, PreparedStatement o Connection?] (Http://stackoverflow.com/q/2363785/1048330) útil. – tenorsax

Respuesta

5

No, eso no es una "buena práctica", ni siquiera una "práctica aceptable". No tiene garantía cuando se llaman finalizadores, por lo que no funcionará.

su lugar debe ámbito de aplicación a los recursos a un bloque, como esto:

try { 
    acquire resource 
} 
finally { 
    if (resource was acquired) 
    release it 
} 
1

No, es poco probable que el finalizador sea llamado de manera oportuna, si es que lo hace alguna vez. Limpia tus recursos de forma explícita y segura.

/* Acquire resource. */ 
try { 
    /* Use resource. */ 
} 
finally { 
    /* Release resource. */ 
} 
-1

Una vez que se obtiene el objeto de conexión, lo utilizan para ejecutar el PreparedStatement/Declaración/CallableStatement que se coloca en un bloque try, a continuación, poner los trabajos de limpieza de la casa como el cierre de la DECLARACIÓN y el conn.

por ejemplo:

try{ 

    Connection conn = DriverManager.getConnection(url,username,password); 

    PreparedStatement pStat = conn.prepareStatement("Drop table info"); 

    pStat.executeUpdate(); 
     } 
     catch(Exception ex){ 
     } 

    finally(){ 

    pStat.close(); 
    conn.close(); 
} 
+1

Los ámbitos de variables son incorrectos aquí; esto no compilará En este ejemplo, se requieren dos bloques try-finally, uno anidado en el otro. – erickson

Cuestiones relacionadas