数据库文件被锁定(Java中的SQL异常)

时间:2017-10-16 12:23:16

标签: java sql sqlite jdbc locked

在我的代码中,每当我调用以下函数时,都可以访问数据库发射器。该函数基本上从数据库中提取数据并将其存储在变量中。

public void fillEmitterDataLists()
{
    EmitterStructVo emitter = new EmitterStructVo();

    try {
        stmt = dbConn.createStatement();

        rs = stmt.executeQuery( "SELECT * FROM Emitter;" );
        while ( rs.next() ) {
            emitter = new EmitterStructVo();
            model.emitterList.add(rs.getString("E_ID"));

            String pri = rs.getString("PRI_ID");
            String pw = rs.getString("PW_ID");
            String rf = rs.getString("RF_ID");
            String reps = rs.getString("Reps");
            String interval = rs.getString("Interval");

            Statement stmt1;
            stmt1 = dbConn.createStatement();

            ResultSet rs1 = stmt1.executeQuery("SELECT * FROM PRI where PRI_ID = '" + pri + "';");
            model.priList.add(rs1.getString("PRI_Values"));

            int priType = Integer.parseInt(rs1.getString("PRI_TYPE"));

            rs1 = stmt1.executeQuery("SELECT * FROM PW where PW_ID = '" + pw + "';");
            model.pwList.add(rs1.getString("PW_Values"));

            rs1 = stmt1.executeQuery("SELECT * FROM RF where RF_ID = '" + rf + "';");
            model.rfList.add(rs1.getString("RF_Values"));
            stmt1.close();
            rs1.close();

        }
        stmt.close();
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

但是如果在调用上面的函数后执行以下代码,则会给出Emitter数据库文件被锁定的错误。然而,如果我之前没有调用上面的函数,下面的代码可以正常工作。所以,显然问题在于fillEmitterDataLists()函数。

Class.forName("org.sqlite.JDBC");
Connection dbConn = DriverManager.getConnection("jdbc:sqlite:FssDb.db");
Statement stmt = dbConn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM Emitter where E_ID = '" + name + "';");

现在我已经关闭了堆栈溢出类似问题中建议的所有语句和结果集,所以我不知道为什么它仍然会产生异常。

请帮帮忙?

2 个答案:

答案 0 :(得分:1)

基于此answer基于多线程和SQLITE。

您可以发现 SQlite不支持多重连接。原因是无论何时在DB上请求连接,都会在该文件上设置锁定,您需要关闭连接以释放该锁定。只有这样,您才能打开新连接。

因此,您必须关闭上述方法中提供的dbConn,或者只是共享连接。

我建议您查看Singleton pattern以正确管理连接。

答案 1 :(得分:1)

SQLite特别关注文件锁定。尝试关闭连接,以便每个函数都打开自己的连接,使用它并在之后关闭它。看看this answer是否对您有所帮助。