Java 在获得所需结果集后关闭连接对象

Java 在获得所需结果集后关闭连接对象,java,jdbc,Java,Jdbc,如果在获得结果集后关闭连接对象,会有任何影响吗 Connection con= DriverManager.getConnection(); Statement st = con.createStatement(); ResultSet rs = st.executeQuery(query); con.close(); 除此之外,我还使用了我的rs对象,我觉得它不会受到任何影响。因为结果集和语句是相互连接的。一旦关闭连接,其他资源(语句s或结果集s)就不能使用。如果要在关闭后访问结果集,则无法

如果在获得
结果集后关闭
连接
对象,会有任何影响吗

Connection con= DriverManager.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(query);
con.close();

除此之外,我还使用了我的
rs
对象,我觉得它不会受到任何影响。因为
结果集
语句
是相互连接的。

一旦关闭
连接
,其他资源(
语句
s或
结果集
s)就不能使用。

如果要在关闭后访问
结果集
,则无法关闭连接。您将丢失
ResultSet
数据,并在尝试访问该数据时出现异常


这是因为
ResultSet
实例链接到数据库连接。

在连接关闭后,不得使用从
连接派生的任何内容

这实际上是因为像结果集这样的东西在您实际使用它们之前可能不会被传输到您的机器上。数据库可以而且确实使用传输批处理和服务器游标—这是一种复杂的方式,表示它们仅在您实际请求时通过移动结果集游标(例如使用
ResultSet\next()
)向您传输行块

结果集的其他部分,如BLOB或其他LOB类型,在您实际从结果集中读取它们之前根本不会被传输。这是因为它们可以任意大,而DB驱动程序(好的,一个好的DB驱动程序)希望最小化它在客户机中使用的内存

DB服务器本身通常比驱动程序复杂得多(驱动程序只不过是一个通信仲裁器),最好将“繁重的工作”(结果集的编组和临时存储)留给DB:-)


因此,您可以看到,关闭连接将释放与您的查询相关的所有服务器资源,并且可能有许多资源。

关闭与数据库的连接后,您无法立即访问结果集。因为,当您使用
resultset.next()
方法时,它会向数据库发送请求以获取下一条记录;但实际上,连接已经关闭。因此,我认为,如果在
con.close()
之后没有其他语句,那么您的语句
resultset.next()

将抛出一个
异常。但是如果您想在
con.close()
之后使用
rs
,那么它将变成错误。这将是一个NPE btw…关闭连接将使与之相关的结果集和语句无效。更好的做法是将结果集转换为DTO,而不是直接使用resultset。在完全了解自己在做什么之前不要这样做。当我说
con.close()
它与连接池和db服务器有什么不同?对不起,我不明白这个问题。我从连接池获得连接,同时从数据库服务器获得连接。在这两种不同的情况下调用“.close()”将完全取消连接对象?为什么需要两个连接?
连接
池中的一个就足够了。你应该只和那个一起工作。无论如何,只有从
连接中获得
ResultSet
才是重要的。当我说
con.close()
它与连接池和数据库服务器有何不同时?“当您使用ResultSet.next()方法时,它会向数据库发送请求以获取下一条记录”->不必为真。这取决于实现。