【问题标题】:SQLite 'Database Locked' weird error for specific queries特定查询的 SQLite 'Database Locked' 奇怪错误
【发布时间】:2012-12-06 15:25:11
【问题描述】:

我正在使用 Java 开发一个项目,我必须在我的 SQLite 数据库中进行修改。 我连接到它并且工作得很好,除了这个奇怪的错误。

s.executeUpdate("INSERT INTO STUDENTS VALUES('S0',11)");
...
//many statements... including queries
...
String c2="INSERT INTO STUDENTS VALUES ('S1', 2)";
s.executeUpdate(c2);
s.executeUpdate("DROP TABLE STUDENTS");

语句s.executeUpdate("INSERT INTO STUDENTS VALUES('S0',11)");s.executeUpdate(c2); 运行完美,并将行插入数据库。但是当谈到下面的语句时,我得到了奇怪的数据库锁定错误。 当我将查询更改为另一个时,它也工作得很好。到达结束语句时出现错误。更准确地说,上面编写的所有查询,即这里代码的第一条语句都可以正常工作。

请帮我找出错误。

【问题讨论】:

  • 请不要在未阅读我的问题的情况下投反对票。我知道 Stack Overflow 上有很多关于这种类型的帖子,但我的帖子很特别。它最后只向我显示了一次异常,我最后也关闭了 Statement 和连接。
  • 您是否开始了一项未向我们展示的交易?我的猜测是您无法删除该表,因为更新将其锁定以等待提交。像 drop 这样的 DDL 语句不是事务性的。
  • @Paolo:在 SQLite 中,DDL 语句也是事务性的。
  • @Paolo:不,所有的语句都类似于插入、查询和更新。就是这样。
  • DROP TABLE 命令不返回受影响记录的数量,因此您应该使用execute 而不是executeUpdate

标签: java database sqlite jdbc database-locking


【解决方案1】:

我猜“s”变量是一个语句。执行后尝试关闭资源:

PreparedStatement updateStatement = connection.prepareStatement("INSERT INTO STUDENTS VALUES ('S1', 2)");
        try {
            updateStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            updateStatement.close();
        }

在每次调用数据库后执行此操作。

【讨论】:

  • 成功了。实际上,我发现了错误。主要的错误是我调用了另一种方法,它在同一个数据库上进行查询并忘记关闭那里的语句和连接。非常感谢您的澄清。
猜你喜欢
  • 2014-04-12
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2018-06-02
  • 2011-11-27
相关资源
最近更新 更多