Java垃圾回收机制能回收数据库连接资源吗?
在一段代码中,一个数据库连接只用了一次,每次运行这段代码都产生一个新的数据库连接资源。那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垃圾回收机制能回收这些不用的连接资源吗? --------------------编程问答-------------------- --------------------编程问答-------------------- 不知道还是不能? --------------------编程问答-------------------- 当然可以 --------------------编程问答-------------------- 真的可以吗??!! --------------------编程问答-------------------- 当然不可以。你直接创建了N个类,每个类都有对应的connection,但是你木有手动关闭,这个东西一直在...jvm当然不会回收了,jvm只是在确定你没有引用别人而且别人也没有引用你的情况才会认为这个对象无用(这么说有点宽泛,先这么理解),然后等待时机回收(线程优先级较低), 可是你现在手里实实在在的拥有一个connection连接,并且未释放,jvm是不会理你的。 --------------------编程问答-------------------- 我觉得这玩意就像文件一样,你流不关。。。只有给操作系统自己处理了 --------------------编程问答-------------------- 关注,.net 下可以使用 using(){}来简单处理此类问题,
不知道java怎么办// --------------------编程问答-------------------- 可以回收,但是如果资源不是很紧张的话,指不定下一次 GC 是在一天后,还是一周之后! --------------------编程问答--------------------
+1 --------------------编程问答-------------------- 建议手动关闭连接。 --------------------编程问答-------------------- 我只知道手动关掉最好,lz还是养成这种习惯吧,对以后只会有好处不会有坏处的
--------------------编程问答-------------------- 垃圾回收器只与内存有关,connection什么的,不确定垃圾回收器也有能力去关闭,或者Java是否有能力关闭一个管道之类的东西,毕竟只有一头在我们自己的程序里。
最好还是使用Java已经提供的机制,手动关掉。如果是数据库的话,很多都是把close方法放到finally{}语句块里的。
仅是自己的一点见解。 --------------------编程问答-------------------- 不可以,需要自己手动释放,或者用flush(),然后close()掉。 --------------------编程问答-------------------- 会回收,但是建议还是都手动关一下。
ps:
PreparedStatement不关,有导致游标耗尽的风险 --------------------编程问答-------------------- 垃圾回收机制管不了数据库连接的,像数据库连接、文件流、网络连接都是属于物理资源,而垃圾回收机制是管理内存的。物理资源需要手动关闭 --------------------编程问答--------------------
非常赞同,补充一下,虽然这些都是物理资源,只有用户关闭了这些链接之后,被他们持有的缓冲区才可能被JVM的GC回收,垃圾回收不会回收数据库连接和网络连接,而是回收分配给他们数据缓冲块。
补充:Java , Java SE