`
wanghaopk
  • 浏览: 48681 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于关闭Connection是否会自动关闭Statement,ResultSet问题

 
阅读更多

做程序离不开连接数据库,所以一些打开,关闭数据库是经常要执行的操作,打开数据库后,在程序用完后要及时关闭数据库连接资源,以释放内存,避免资源耗尽.但现在有一个问题,即当我们关闭了Connection对象后,Statement,ResultSet对象是否会自动关闭问题,对于这个问题,之前我在网上也找了相关资料,说会自动关闭,所以一段时间以来,我都是只关闭Connection对象,而没有关闭Statement,ResultSet对象,但程序也能正常运行,程序也没有因为资源耗尽而崩溃,对于这一点,其实是有原因的:

    1)首先,关闭了Connection对象后,是不会自动关闭Statement,ResultSet对象的:

try {
Connection con = null;
Statement st = null;
ResultSet rs = null;
con = getConnection();
st = con.createStatement();
rs = st.executeQuery(sql);
}
catch(Exception e) {
 System.out.println("ocurr error");
}
finally {
          con.close();con=null;
 try {
    con.close();
 }
 catch(SQLException se) {
    System.out.println("ocurr close error");
 } 
}

System.out.println("statement object:"+st);
System.out.println("resultset object:"+rs);

 

上面的代码先获取了连接,然后只关闭了Connection对象,而没有关闭Statement,ResultSet对象,最后两行代码输出Statement,ResultSet对象,是有结果的,表明关闭了Connection对象,而没有关闭Statement,ResultSet对象.

2)Statement对象将由Java垃圾收集程序自动关闭,而作为一种好的编程风格,应在不需要Statement对象时显式地关闭它们,这将立即释放DBMS资源,有助于避免潜在的内存问题.

3)ResultSet维护指向其当前数据行的光标.每调用一次next方法,光标向下移动一行.最初它位于第一行之前,因此第一次调用next将把光标置于第一行上,使它成为当前行.随着每次调用next导致光标向下移动一行.按照从上至下的次序获取ResultSet行,在ResultSet对象或其父辈Statement对象关闭之前,光标一直保持有效.

     所以在打开数据库资源后,尽量手工关闭Connection对象和Statement,ResultSet对象,要养成一种良好的编程风格.

注:他们三者之间关闭没有任何关联,即先关闭谁没有任何先后顺序,可以先关闭他们中的任何一个,且关闭其中的任何一个对象都不会关闭其他其他对象,但一般养成按关闭ResultSet,Statement,Connection的顺序关闭资源.

分享到:
评论

相关推荐

    怎样实现关闭connection时自动关闭Statement和ResultSet (下篇)

    在这个改进后的版本中,当离开try块时,所有的AutoCloseable对象(包括Connection、Statement和ResultSet)都会自动关闭,无论是否抛出异常,从而避免了资源泄露的问题。 此外,还可以考虑使用PreparedStatement和...

    描述Connection、Statement、ResultSet接口的作用

    标题和描述均聚焦于解释Java Database Connectivity (JDBC)中三个核心接口——`Connection`、`Statement`和`ResultSet`的作用。这三个接口是JDBC API的核心组成部分,它们共同协作,使得Java应用程序能够与各种关系...

    ResultSet

    5. 关闭资源:处理完ResultSet后,别忘了关闭它,以及相关的Statement和Connection,以避免资源泄露。这通常在finally块中完成,以确保即使在异常情况下也能正确关闭: ``` try (ResultSet rs = stmt.executeQuery...

    支持ResultSet的JTable

    2. **SQL查询**:执行`Statement`或`PreparedStatement`对象的`executeQuery()`方法来执行SQL查询,这会返回一个`ResultSet`对象。 3. **处理ResultSet**:`ResultSet`是一个游标,可以按照顺序读取查询结果。我们...

    如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回.doc

    总结来说,从Java存储过程返回JDBC ResultSet作为REF CURSOR,主要是为了解决Oracle数据库的特性和JDBC的兼容问题。通过Oracle9i引入的特性,开发者可以利用这种方法在PL/SQL和Java之间更灵活地交换数据。然而,这种...

    prepareStatement和Statement的区别

    首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement() 方法创建,而 PreparedStatement 需要通过 Connection 对象的 prepareStatement() 方法创建,并且需要带有 SQL 语句。...

    jdbc connection

    6. **关闭资源**:完成数据库操作后,必须关闭所有打开的资源,包括`ResultSet`、`Statement`和`Connection`,以释放数据库资源。 ### 数据库配置 在实际应用中,通常将数据库连接信息(如URL、用户名、密码)存储...

    mysq_ jdbc连接与关闭封装代码

    此方法依次关闭`ResultSet`、`Statement`和`Connection`。 **2. 用于INSERT/UPDATE/DELETE操作的关闭方法** ```java public static void close(Statement stmt, Connection conn) { close(stmt); close(conn); } ...

    Connection

    根据给定的文件信息,我们可以总结出以下关于SQL数据库连接(Connection)的相关知识点: ### SQL数据库连接(Connection)概述 在Java中,`Connection`对象是JDBC API的核心组件之一,用于与数据库建立连接。它是...

    java 代码笔记 2010-06-23 对ResultSet()的几个常用操作,实例。

    处理完ResultSet后,别忘了关闭它以及相关的Statement和Connection,以释放系统资源: ```java finally { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close();...

    java测试数据库连接关闭

    在Java中,我们可以使用try-with-resources语句,它会自动关闭在try块中声明的实现了AutoCloseable接口的对象,例如Connection、Statement和ResultSet。 下面是一个示例,展示了如何正确关闭数据库连接: ```java ...

    java-JDBC-AutoClose-自动关闭的JDBCUtil,效果高于传统JDBC

    在JDBC中,我们通常会创建`Connection`对象来建立与数据库的连接,然后创建`Statement`或`PreparedStatement`对象来执行SQL语句,最后处理返回的`ResultSet`对象。这些步骤都需要在使用完毕后手动关闭,否则可能导致...

    mysql-connection.jar

    - **关闭资源**:执行完数据库操作后,记得关闭Statement、ResultSet和Connection,释放资源。 4. **连接池** 在实际应用中,通常会使用连接池如C3P0、HikariCP或Apache DBCP等,管理数据库连接。连接池预先创建...

    java 真正的安全的资源的释放

    1. **误区一**:在`Connection`上调用`close()`方法会自动关闭所有关联的`PreparedStatement`和`ResultSet`。 - **实际情况**:虽然在某些情况下这是成立的(例如使用`DriverManager.getConnection()`直接获取的`...

    JDBC PrepareStatement 使用(附各种场景 demo)

    在使用JDBC和PrepareStatement时,别忘了关闭资源,例如ResultSet、Statement和Connection,以避免内存泄漏。可以使用try-with-resources语句来确保资源的正确关闭。 这个资源提供的示例代码将帮助开发者深入理解...

    c3p0配置文件

    public static void close(ResultSet resultSet, Statement statement, Connection connection){ if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } }...

    JDBC(用PrepareStatement实现)

    执行完毕后,记得关闭PreparedStatement、ResultSet和Connection,以释放数据库资源。通常使用try-with-resources语句来自动关闭资源: ```java try (PreparedStatement pstmt = conn.prepareStatement(sql)) { ...

    Java-JDBC【源码】JDBC概述、获取连接、SQL注入问题与解决、查询解析

    7.关闭连接 `ResultSet 、Statement 、Connection` 3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2.PreparedStatement解决 3.3.Statement 与 PreparedStatement 4.完整源码

    JdbcConnection

    6. **关闭资源**:操作完成后,必须关闭ResultSet、Statement和Connection,释放数据库资源,避免内存泄漏。 在实际开发中,为了提高性能和安全性,通常会采用连接池(如Apache DBCP、C3P0)来管理数据库连接,以及...

    DruidJDBCUtils.java

    public static void close(ResultSet resultSet, Statement statement, Connection connection) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace();...

Global site tag (gtag.js) - Google Analytics