在一段代码中,一个数据库连接只用了一次,每次运行这段代码都产生一个新的数据库连接资源。那java的垃圾回收机制能释放前面几次不用的数据库连接资源吗?比如以下代码:public class BookDao {
 Connection con=null;
 PreparedStatement ps=null;
 ResultSet rs=null;
 String sql=null;
 String TableName="BookInfo";
 String Type=null;
 int BookID;
 
 public BookDao(String Type){
 this.Type=Type;
 sql="select   * from  "+TableName+" Where Type=?";
 Connection con=Tool.getConnection();//Tool是个工具类,用来获得数据库的连接。
        
try 
{
ps = con.prepareStatement(sql);
ps.setString(1,Type );
rs=ps.executeQuery();


catch (SQLException e) {
e.printStackTrace();
}
 }
          
     public List<Book> getBooks(){
 
 List<Book> Booklist=new ArrayList<Book>();
 try 
 {
while(rs.next())
 {
 Book book=new Book();
 book.setBookName(rs.getString(1));
 book.setPublisher(rs.getString(2));
 book.setType(rs.getString(3));
 book.setAuthor(rs.getString(4));
 book.setZhaiYao(rs.getString(5));
 book.setPrice(rs.getString(6));
 book.setHYPrice(rs.getString(7));
 book.setBookImg(rs.getString(8));
 book.setBookID(rs.getInt(8));
 Booklist.add(book);

 }
 } 
 catch (SQLException e)
 {
e.printStackTrace();
 }

 return Booklist;
 }
     
    
}像这段代码,我没有显示的关闭数据库连接,而且每次调用getBooks方法时都要先创建一个BookDao对象,也就创建了一个新的数据库连接。那前面几次的连接java垃圾回收机制能回收这些不用的连接资源吗?

解决方案 »

  1.   

    当然不可以。你直接创建了N个类,每个类都有对应的connection,但是你木有手动关闭,这个东西一直在...jvm当然不会回收了,jvm只是在确定你没有引用别人而且别人也没有引用你的情况才会认为这个对象无用(这么说有点宽泛,先这么理解),然后等待时机回收(线程优先级较低), 可是你现在手里实实在在的拥有一个connection连接,并且未释放,jvm是不会理你的。 
      

  2.   

    关注,.net 下可以使用 using(){}来简单处理此类问题,
    不知道java怎么办//
      

  3.   

    垃圾回收器只与内存有关,connection什么的,不确定垃圾回收器也有能力去关闭,或者Java是否有能力关闭一个管道之类的东西,毕竟只有一头在我们自己的程序里。最好还是使用Java已经提供的机制,手动关掉。如果是数据库的话,很多都是把close方法放到finally{}语句块里的。仅是自己的一点见解。
      

  4.   

    不可以,需要自己手动释放,或者用flush(),然后close()掉。
      

  5.   

    会回收,但是建议还是都手动关一下。
    ps:
    PreparedStatement不关,有导致游标耗尽的风险
      

  6.   

    非常赞同,补充一下,虽然这些都是物理资源,只有用户关闭了这些链接之后,被他们持有的缓冲区才可能被JVM的GC回收,垃圾回收不会回收数据库连接和网络连接,而是回收分配给他们数据缓冲块。