当前位置: 首页 > 知识库问答 >
问题:

连接到sqlite数据库、执行准备好的语句并关闭与java的连接的正确方法是什么?

常枫涟
2023-03-14

这是我目前的代码。我有几个问题:

  • 数据库正忙-错误
  • SQL错误或缺少数据库
  • 结果集已关闭

如果我想防止这两个错误,我应该使用哪种代码结构?我需要在try块中连接吗?我需要在哪里关闭连接?我需要在哪里关闭准备语句?

直到现在,我还无法通过自己连接不同页面的信息来找到解决方案。

    public boolean checkForUser(String username){
        try(Connection con = this.connect();
                PreparedStatement pstmt = createPreparedStatementRegistrate(conn, username);
                ResultSet rs= pstmt.executeQuery();)
                {
                if (rueck.next()){
                    pstmt.close();
                    rs.close();
                    con.close();
                    //do some stuff
                }
        }catch(SQLException e){
            e.printStackTrace();
        }
        return null;
    }
private PreparedStatement createPreparedStatementRegistrate(Connection conn, String username) throws SQLException {
    String sql = "SELECT * FROM users WHERE username = ?";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setString(1, username);
    return pstmt;
}
private Connection connect() {
        String url = "jdbc:sqlite:user.db";
        Connection con = null;
        try {
            con = DriverManager.getConnection(url);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }
java.sql.SQLException: ResultSet closed
    at org.sqlite.core.CoreResultSet.checkOpen(CoreResultSet.java:69)
    at org.sqlite.jdbc3.JDBC3ResultSet.findColumn(JDBC3ResultSet.java:38)
    at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:443)
    at zugriffsverwaltung.Zugriffsverwaltung.loeschen(Zugriffsverwaltung.java:215)
    at zugriffsverwaltung.Zugriffsverwaltung.<init>(Zugriffsverwaltung.java:37)
    at main.Server.<init>(Server.java:29)
    at main.Server.main(Server.java:46)
org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)
    at org.sqlite.core.DB.newSQLException(DB.java:909)
    at org.sqlite.core.CoreStatement.internalClose(CoreStatement.java:115)
    at org.sqlite.jdbc3.JDBC3Statement.close(JDBC3Statement.java:35)
    at org.sqlite.jdbc4.JDBC4Statement.close(JDBC4Statement.java:27)
    at zugriffsverwaltung.Zugriffsverwaltung.loeschen(Zugriffsverwaltung.java:238)
    at zugriffsverwaltung.Zugriffsverwaltung.<init>(Zugriffsverwaltung.java:37)
    at main.Server.<init>(Server.java:29)
    at main.Server.main(Server.java:46)

共有1个答案

禄仲渊
2023-03-14

问题是,在处理结果集之前,您正在关闭结果集、语句和连接。这是不允许的:当您使用getString检索值时,需要打开结果集(未显示在代码中,但存在于堆栈跟踪中)。

由于您正在使用try with resource,它将在退出时关闭资源,因此甚至没有必要显式关闭。SQLite驱动程序似乎也不符合JDBC的要求,即关闭已经关闭的资源应该是不可操作的,因为它引发了一个异常,即在关闭语句时关闭了连接(可能是通过try with resources)。

您需要将代码更改为

public boolean checkForUser(String username){
    try(Connection con = this.connect();
            PreparedStatement pstmt = createPreparedStatementRegistrate(conn, username);
            ResultSet rs= pstmt.executeQuery();)
            {
            if (rueck.next()){
                //do some stuff
            }
    }catch(SQLException e){
        e.printStackTrace();
    }
    return null;
}

也就是把线去掉

pstmt.close();
rs.close();
con.close();
 类似资料:
  • 问题内容: 我试图关闭数据库连接,但是有点困惑 我是否必须靠近它 要么 两者之间有什么区别? 问题答案: 这些方法只能关闭。您仍然必须关闭全部和实例。我建议这样做。就像是, 如果您使用我的实用程序,则finally块可能是,

  • 问题内容: 我正在尝试使用jdbc-odbc桥创建一个简单的连接: 但是然后我得到这个异常: 有任何想法吗? 2009年3月24日更新:现在可以使用了。创建了一个用户数据源,由于某种原因该异常消失了。 作为一个普遍的问题,用Java处理数据库连接的最佳方法是什么? 问题答案: 为了回答您的一般问题,我想说处理Java中数据库连接的最佳方法是避免JDBC- ODBC桥。可以测试或学习JDBC,但不能

  • 我试图关闭数据库连接。但是有了一点困惑,说 我是否必须靠近它 或者 这两者之间有什么区别?

  • 我想通过pymongo阅读集合,但我得到以下错误: 回溯(最近的调用为last):文件“C://users/gsingh/pycharmprojects/mc/quizQuestionAnswers.py”,第21行,pprint.pprint(posts.find_one())文件“C:\users\gsingh\appdata\local\continuum\anaconda2\lib\sit

  • 我在我的网络应用程序中使用spring mongo。当我在Tomcat7中取消部署应用程序时,内存泄漏。我怀疑可能是我没有明确关闭的Mongo对象。我想知道关闭它的正确方式(和位置)。

  • 据我所知,每次初始化PreparedStatement时,语句都会缓存在为数据库连接分配的内存中。因此,如果初始化过多的PreparedStatement变量,则存在连接可用内存溢出的风险。 > 是否通过调用实例来释放缓存内存? 是否有两个包含相同的SQL的准备声明创建重复的缓存事件,或者数据库是否足够智能,不会缓存重复的准备声明的新实例? 示例1,此连接会溢出内存吗?: 如果会,那这个呢?: