如果我拿到Connection
后关闭ResultSet
对象会有什么影响吗?
Connection con= DriverManager.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(query);
con.close();
除此之外,我使用我的rs
对象,我觉得不会对它产生任何影响。因为ResultSet
和Statement
相互关联。
答案 0 :(得分:3)
关闭Connection
后,不得使用其他资源(Statement
或ResultSet
s。)
答案 1 :(得分:3)
在连接关闭后,您不得使用从Connection
派生的任何内容。
这实际上是因为在您实际使用结果集之前,可能无法将结果集等内容传输到您的计算机。数据库可以并且确实使用传输批处理和服务器游标 - 这是一种复杂的方式,它说它们只是在您通过移动结果集游标(例如使用ResultSet#next()
)实际请求时将一块行传输给您。
结果集的其他部分(如BLOB或其他LOB类型)在您实际从结果集中读取之前根本不会传输。那是因为它们可以任意大,而DB驱动程序(好吧,好的 DB驱动程序)想要最小化它在客户端中使用的内存。
数据库服务器本身通常比驱动程序(它只是一个通信仲裁器)复杂得多,并且最好将“繁重的”(结果集的编组和临时存储)留给数据库: - )
因此,您可以看到关闭连接将释放所有服务器资源 - 并且可能有很多 - 与您的查询相关联。
答案 2 :(得分:3)
关闭与数据库的连接后,很快就无法访问结果集。因为,当您使用resultset.next()
方法时,它会向数据库发送请求以获取下一条记录;但物理上连接已经关闭。因此,您的语句Exception
会抛出resultset.next()
。
答案 3 :(得分:2)
如果要在关闭后访问ResultSet
,则无法关闭连接。您将丢失ResultSet
数据,并在尝试访问时获得异常。
这是因为ResultSet
实例链接到数据库连接。