选择后插入时SQLITE_BUSY:通过JDBC SQLITE

问题描述 投票:1回答:1

试图从中选择后写入到一个表时,我发现了错误代码SQLITE_BUSY。 select语句和结果正确之前,我插入关闭。

如果我去掉选择部分插入工作正常。这就是我没有收到。根据文档SQLITE_BUSY应该意味着不同的处理或连接(其是definetly不是这种情况在这里)挡住了数据库。

有没有SQLite的经理运行。此外jdbcConn是我唯一的数据库连接。无并行运行的线程以及。

这里是我的代码:

    try {
        if(!jdbcConn.isClosed()) {
            ArrayList<String> variablesToAdd = new ArrayList<String>();

            String sql = "SELECT * FROM VARIABLES WHERE Name = ?";

            try (PreparedStatement stmt = jdbcConn.prepareStatement(sql)) {
                for(InVariable variable : this.variables.values()) {
                    stmt.setString(1, variable.getName());
                    try(ResultSet rs = stmt.executeQuery()) {
                        if(!rs.next()) {
                            variablesToAdd.add(variable.getName());                 
                        }
                    }
                }
            }

            if(variablesToAdd.size() > 0) {
                String sqlInsert = "INSERT INTO VARIABLES(Name, Var_Value) VALUES(?, '')";
                try(PreparedStatement stmtInsert = jdbcConn.prepareStatement(sqlInsert)) {
                    for(String name : variablesToAdd) {
                        stmtInsert.setString(1, name);
                        int affectedRows = stmtInsert.executeUpdate();

                        if(affectedRows == 0) {
                            LogManager.getLogger().error("Error while trying to add missing database variable '" + name + "'.");
                        }
                    }
                }

                jdbcConn.commit();
            }
        }
    }
    catch(Exception e) {
        LogManager.getLogger().error("Error creating potentially missing database variables.", e);
    }

这崩溃的int affectedRows = stmtInsert.executeUpdate();。现在,如果我删除第一个块(和手动的值添加到variablesToAdd列表)中的值插入细到数据库中。

我缺少的东西吗?我不能关闭ResultSet和PreparedStatement是否正确?也许我瞎了我的错误,从看它太久。

编辑:也执行选择在一个单独的线程的伎俩。但是,这不是解决办法。上午我试图关闭以前的发言后,插入数据库太快了?

EDIT2:我碰到一个busy_timeout,其承诺将进行更新/查询等待指定的时间量与SQLITE_BUSY返回之前。我尝试设置忙超时,如下所示:

if(jdbcConn.prepareStatement("PRAGMA busy_timeout = 30000").execute()) {
    jdbcConn.commit();
}

executeUpdate()功能仍然immedeiately与SQLITE_BUSY返回。

sqlite jdbc
1个回答
1
投票

我是哑巴。我被我使用相同的文件错过了一个不同的线程的事实,删除select语句的工作(仍然不知道为什么工作,可能错误的时机)揭去。

取得两个线程使用相同的java.sql.Connection和现在的一切工作正常。

谢谢你把我推在正确的方向@GordThompson。不知道这导致我找到问题的jdbc:sqlite::memory:选项。

© www.soinside.com 2019 - 2024. All rights reserved.