做程序离不开连接数据库,所以一些打开,关闭数据库是经常要执行的操作,打开数据库后,在程序用完后要及时关闭数据库连接资源,以释放内存,避免资源耗尽.但现在有一个问题,即当我们关闭了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的顺序关闭资源.
分享到:
相关推荐
在这个改进后的版本中,当离开try块时,所有的AutoCloseable对象(包括Connection、Statement和ResultSet)都会自动关闭,无论是否抛出异常,从而避免了资源泄露的问题。 此外,还可以考虑使用PreparedStatement和...
标题和描述均聚焦于解释Java Database Connectivity (JDBC)中三个核心接口——`Connection`、`Statement`和`ResultSet`的作用。这三个接口是JDBC API的核心组成部分,它们共同协作,使得Java应用程序能够与各种关系...
5. 关闭资源:处理完ResultSet后,别忘了关闭它,以及相关的Statement和Connection,以避免资源泄露。这通常在finally块中完成,以确保即使在异常情况下也能正确关闭: ``` try (ResultSet rs = stmt.executeQuery...
2. **SQL查询**:执行`Statement`或`PreparedStatement`对象的`executeQuery()`方法来执行SQL查询,这会返回一个`ResultSet`对象。 3. **处理ResultSet**:`ResultSet`是一个游标,可以按照顺序读取查询结果。我们...
总结来说,从Java存储过程返回JDBC ResultSet作为REF CURSOR,主要是为了解决Oracle数据库的特性和JDBC的兼容问题。通过Oracle9i引入的特性,开发者可以利用这种方法在PL/SQL和Java之间更灵活地交换数据。然而,这种...
首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement() 方法创建,而 PreparedStatement 需要通过 Connection 对象的 prepareStatement() 方法创建,并且需要带有 SQL 语句。...
6. **关闭资源**:完成数据库操作后,必须关闭所有打开的资源,包括`ResultSet`、`Statement`和`Connection`,以释放数据库资源。 ### 数据库配置 在实际应用中,通常将数据库连接信息(如URL、用户名、密码)存储...
此方法依次关闭`ResultSet`、`Statement`和`Connection`。 **2. 用于INSERT/UPDATE/DELETE操作的关闭方法** ```java public static void close(Statement stmt, Connection conn) { close(stmt); close(conn); } ...
根据给定的文件信息,我们可以总结出以下关于SQL数据库连接(Connection)的相关知识点: ### SQL数据库连接(Connection)概述 在Java中,`Connection`对象是JDBC API的核心组件之一,用于与数据库建立连接。它是...
处理完ResultSet后,别忘了关闭它以及相关的Statement和Connection,以释放系统资源: ```java finally { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close();...
在Java中,我们可以使用try-with-resources语句,它会自动关闭在try块中声明的实现了AutoCloseable接口的对象,例如Connection、Statement和ResultSet。 下面是一个示例,展示了如何正确关闭数据库连接: ```java ...
在JDBC中,我们通常会创建`Connection`对象来建立与数据库的连接,然后创建`Statement`或`PreparedStatement`对象来执行SQL语句,最后处理返回的`ResultSet`对象。这些步骤都需要在使用完毕后手动关闭,否则可能导致...
- **关闭资源**:执行完数据库操作后,记得关闭Statement、ResultSet和Connection,释放资源。 4. **连接池** 在实际应用中,通常会使用连接池如C3P0、HikariCP或Apache DBCP等,管理数据库连接。连接池预先创建...
1. **误区一**:在`Connection`上调用`close()`方法会自动关闭所有关联的`PreparedStatement`和`ResultSet`。 - **实际情况**:虽然在某些情况下这是成立的(例如使用`DriverManager.getConnection()`直接获取的`...
在使用JDBC和PrepareStatement时,别忘了关闭资源,例如ResultSet、Statement和Connection,以避免内存泄漏。可以使用try-with-resources语句来确保资源的正确关闭。 这个资源提供的示例代码将帮助开发者深入理解...
public static void close(ResultSet resultSet, Statement statement, Connection connection){ if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } }...
执行完毕后,记得关闭PreparedStatement、ResultSet和Connection,以释放数据库资源。通常使用try-with-resources语句来自动关闭资源: ```java try (PreparedStatement pstmt = conn.prepareStatement(sql)) { ...
7.关闭连接 `ResultSet 、Statement 、Connection` 3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2.PreparedStatement解决 3.3.Statement 与 PreparedStatement 4.完整源码
6. **关闭资源**:操作完成后,必须关闭ResultSet、Statement和Connection,释放数据库资源,避免内存泄漏。 在实际开发中,为了提高性能和安全性,通常会采用连接池(如Apache DBCP、C3P0)来管理数据库连接,以及...
public static void close(ResultSet resultSet, Statement statement, Connection connection) { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace();...