java - 关闭 DAO 对象中的连接

标签 java database servlets jdbc dao

<分区>

我的 DAO 对象

package com.myselect;

import java.sql.*;
import java.sql.DriverManager;

import java.util.logging.Level;
import java.util.logging.Logger;

public class DataAccess {

    Connection conn;
    PreparedStatement pst;
    ResultSet rs;

    public DataAccess() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/db", "root", "root");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public String getAge(String name) {
        String userage = null;
        try {
            pst = conn.prepareStatement("select age from mydb where name= ?");
            pst.setString(1, name);

            rs = pst.executeQuery();

            while (rs.next()) {
                userage = rs.getString("age");
                System.out.println(userage);
            }

        } catch (Exception ex) {
            Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
        }

        return userage;
    }

    public int insertRecord(String name, int addage) {
        int b = 0;
        try {
            pst = conn.prepareStatement("insert into mydb values(?,?)");
            pst.setString(1, name);
            pst.setInt(2, addage);
            b = pst.executeUpdate();

        } catch (Exception ex) {
            Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
        }

        return b;
    }


}

我想关闭连接。我有几个调用 insertRecordgetAge 方法的 servlet。关闭连接的最佳方法是什么?创建另一个方法并从 insertRecordgetAge 方法或在构造函数中调用?

最佳答案

在考虑连接之前,您还应该始终在每次使用ResultSetStatement 对象时关闭它们。不要将它们作为 DataAccess 对象中的状态。将它们作为局部变量并在使用后关闭它们:

public String getAge(String name) {
    PreparedStatement pst = null;
    ResultSet rs = null;
    String userage = null;
    try {
        pst = conn.prepareStatement("select age from mydb where name= ?");
        pst.setString(1, name);

        rs = pst.executeQuery();

        while (rs.next()) {
            userage = rs.getString("age");
            System.out.println(userage);
        }

    } catch (Exception ex) {
        Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
       // closing JDBC resources
       if(rs != null) {
          rs.close();
       }

      if(pst != null) {
          pst.close();
       }

    return userage;
}

连接也一样:理想情况下,每个方法都应该创建一个 Connection 对象并在使用后关闭它。根据您在方法中打开和关闭连接的频率,您可能希望使用连接池来共享打开的连接以提高效率。

要关闭连接及其资源,您可以创建一个方法来执行此操作:

public void closeConnection(Connection connection, Statement statement, ResultSet resultSet) {
     ... // close resources here   
}

关于java - 关闭 DAO 对象中的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29891115/

相关文章:

java - Grails + quartz : Threads don't stop properly

java - 检查 boolean 值时,我不断收到空指针异常错误

java - 添加 Junit setup/@Before 逻辑而不更改代码?

mysql - 我从/db/mysql56删除文件后MAMP要求安装wordpress

java - 如何使用 Spring RestTemplate 处理传输编码分块 json

database - 在 Cloud Spanner 中,如何查看与我的实例的连接

java - 删除 SQLite DB 表中的最后一个元素

java - 无法从 servlet 重定向到 jsp 页面

java - 如何链接 JSP、servlet 和 Java View bean?

java - 我在 Netbeans 中创建的 Java Servlet 是否添加了一些奇怪的东西?