#断开数据库连接

数据库操作完成后,应及时关闭ResultSet、Statement和Connection,释放结果集、语句及数据库会话占用的资源。

JDBC资源之间存在依赖关系,推荐按照以下顺序关闭:

  1. 关闭ResultSet。
  2. 关闭Statement或PreparedStatement。
  3. 关闭Connection。

关闭Statement时,其当前ResultSet也会被关闭;关闭Connection时,其关联的语句和结果集也会被关闭。应用程序仍应按照资源的使用范围及时关闭各对象,避免资源占用时间过长。

# 关闭连接前处理事务

关闭连接前,应显式完成当前事务。关闭自动提交后,应用程序应根据业务执行结果调用commit()或rollback(),再关闭连接。不要依赖close()隐式提交或回滚尚未完成的事务。

connection.setAutoCommit(false);
try {
    connection.commit();
} catch (SQLException exception) {
    connection.rollback();
    throw exception;
}

事务处理方法请参考处理事务。

# 关闭数据库连接

调用Connection.close()可以关闭数据库连接。连接关闭后,不能再使用该连接创建语句或访问数据库。

connection.close();

下面示例在finally代码块中显式调用close(),确保查询正常结束或发生SQLException时都会关闭连接。示例同时调用isClosed()输出连接的关闭状态。

package quickstart;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class CloseConnectionExample {
    // 数据库连接参数。
    private static final String URL =
            "jdbc:yasdb://192.168.1.2:1688/yasdb";
    private static final String USER = "username";
    private static final String PASSWORD = "passwd";

    public static void main(String[] args) throws SQLException {
        // 设置登录用户名和密码。
        Properties properties = new Properties();
        properties.setProperty("user", USER);
        properties.setProperty("password", PASSWORD);

        Connection connection = null;
        try {
            // 创建数据库连接。
            connection = DriverManager.getConnection(URL, properties);

            // 执行查询并处理结果,Statement和ResultSet由
            // try-with-resources自动关闭。
            try (Statement statement = connection.createStatement();
                 ResultSet resultSet =
                         statement.executeQuery("SELECT 1 FROM dual")) {
                if (resultSet.next()) {
                    System.out.println(
                            "Query result: " + resultSet.getInt(1));
                }
            }
        } finally {
            // 无论查询是否成功,都显式关闭数据库连接。
            if (connection != null) {
                connection.close();
                System.out.println(
                        "Connection closed: " + connection.isClosed());
            }
        }
    }
}

示例执行成功时,输出如下:

Query result: 1
Connection closed: true

# 使用try-with-resources关闭资源

推荐使用try-with-resources管理JDBC资源。Java会在代码块结束时按照资源声明顺序的相反顺序自动调用每个对象的close(),发生SQLException时也会关闭资源。

下面代码依次声明Connection、Statement和ResultSet。退出代码块时,Java依次关闭ResultSet、Statement和Connection。

// 在try后的括号中声明需要自动关闭的资源。
try (Connection connection =
             DriverManager.getConnection(URL, properties);
     Statement statement = connection.createStatement();
     ResultSet resultSet =
             statement.executeQuery("SELECT 1 FROM dual")) {
    // 遍历并处理查询结果。
    while (resultSet.next()) {
        System.out.println(resultSet.getInt(1));
    }
} // 此处自动关闭ResultSet、Statement和Connection。

# 手动关闭多个资源

无法使用try-with-resources时,应在finally代码块中关闭资源。关闭前需要判断对象是否为null,并分别处理关闭过程中产生的SQLException,确保前一个资源关闭失败时仍会继续关闭其他资源。

手动关闭多个资源时,应按照ResultSet、Statement和Connection的顺序分别调用close():

if (resultSet != null) {
    resultSet.close();
}
if (statement != null) {
    statement.close();
}
if (connection != null) {
    connection.close();
}

# 连接池中的关闭操作

从连接池获取连接后,同样应调用Connection.close()。在常见连接池实现中,该操作通常将连接归还连接池,而不是直接关闭底层物理连接。具体行为以所使用的连接池实现为准。

edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流