2012-05-13 18 views
5

thể trùng lặp:
Why would you ever implement finalize()?Đang đóng kết nối để hoàn thành thực tiễn tốt nhất?

tôi thấy một số file java với đoạn mã sau:

public void finalize() { 
    if (conn != null) { 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
     } 
    } 
} 
  • Được đóng một Connection trong thực hành tốt nhất finalize phương pháp?
  • Có đủ để đóng Connection hoặc không cần phải đóng các đối tượng khác như PreparedStatement?
+0

Theo [Effective Java] (http://www.informit.com/articles/article.aspx?p=1216151&seqNum=7) - thực hành tốt nhất là 'Tránh finalizers ' – tenorsax

+0

Bạn có thể tìm thấy [Tôi nên đóng đầu tiên, Chuẩn bị sẵn sàng hoặc kết nối?] (Http://stackoverflow.com/q/2363785/1048330) hữu ích. – tenorsax

Trả lời

5

Không, đó không phải là "thực hành tốt nhất" hoặc thậm chí là "thực hành có thể thực hiện được". Bạn không có đảm bảo khi nào ở tất cả các finalizers được gọi, do đó, nó sẽ không hoạt động.

Thay vào đó bạn nên phạm vi ra nguồn lực để một khối, như thế này:

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

Không, trình kết thúc không được gọi đúng lúc, nếu có. Dọn dẹp tài nguyên của bạn một cách rõ ràng và chắc chắn.

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

Khi đối tượng Connection thu được, sử dụng nó để thực hiện PreparedStatement/Tuyên Bố/CallableStatement đó được đặt trong một khối try, sau đó đặt các công việc nhà sạch như đóng Statment, và conn.

ví dụ:

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

Phạm vi biến không chính xác ở đây; điều này sẽ không biên dịch. Trong ví dụ này, hai khối try-finally được gọi cho, một khối được lồng vào nhau. – erickson

Các vấn đề liên quan