2012-08-01 79 views
1

在JDBC literatur我经常遇到像方法终止时是否需要关闭连接和语句?

void databaseCall() { 
    Connection con = null; 
    Statement statement = null   
    try {  
      con = getConnection(...);  
      statement = con.createStatement(...);   
      // do some query 
    } catch (SQLException e) { 
     // bla bla 
    } finally { 
     try {con.close();} catch (Exception e1) {} 
     try {statement.close();} catch (Exception e1) {} 
    } 
} 

片断我知道这是最好的做法,关闭连接和语句明确地,但是,在这种情况下,显然是资源constatement会时结束该方法被关闭,即当try块完成时。 finally区块中的close声明真的有必要吗?即使我们没有明确地释放资源,当方法结束时它们不会被关闭吗?

+0

你应该把'close()'调用到'finally'块中。如果你没有正确地关闭资源,即使客户端程序已经完成,某些DBMS也会保留这些东西。 – 2012-08-01 11:10:00

+0

谢谢。纠正。 – gefei 2012-08-01 11:12:50

+0

@ G.Z。类似于你的疑问被解释[这里](http://stackoverflow.com/questions/11750708/statement-and-resultset-close-after-connection-close) – user75ponic 2012-08-01 12:09:31

回答

4

不,他们不会被关闭。

如果getConnection()创建一个新的连接,那么在该方法结束时唯一会发生的情况是连接可能被垃圾收集。但GC不会为你调用close()方法。无论如何,你想尽快关闭。

大多数情况下,getConnection()只会从连接池中获得连接,并保持很长一段时间。如果连接不是close(),则不会将其放回可用连接池中,几秒或几分钟后,您将不再有任何可用连接。

标题询问System.exit(),但问题正文没有。如果您拨打System.exit(),则连接将最终关闭,因为数据库会注意到通信中断。但是程序启动,执行查询和退出的情况非常罕见。大多数应用程序开始并保持运行数天甚至数月。所以,一旦完成使用,你真的想要释放连接。

-2

假设您为ekart应用程序带来了20个连接,这意味着连接池只有20个连接。如果您向服务器发送请求,则池为每个请求提供连接。如果您不关闭连接, 'OutOfConnectionError',即使你不能处理这个错误,你也无法发送请求,因为没有连接。如果你关闭连接,那么只有你可以发送新的请求.........