Java-SQLite数据库在删除表时被锁定

Java-SQLite数据库在删除表时被锁定,java,sql,sqlite,jdbc,Java,Sql,Sqlite,Jdbc,我试图使用JDBC删除SQLite数据库表中的一列。由于SQLite中没有这样的函数,为了实现这一点,我使用了以下方法: 创建一个新表(t1\u backup),其中包含所有列,但不包括要删除的列 将所有数据(要删除的列的数据除外)复制到新表中 删除旧表(t1) 重命名新表(t1\u backup-->t1) 实际代码如下: Connection cn = DriverManager.getConnection("jdbc:sqlite:"+path); Statement stmt = new

我试图使用JDBC删除SQLite数据库表中的一列。由于SQLite中没有这样的函数,为了实现这一点,我使用了以下方法:

  • 创建一个新表(
    t1\u backup
    ),其中包含所有列,但不包括要删除的列
  • 将所有数据(要删除的列的数据除外)复制到新表中
  • 删除旧表(
    t1
  • 重命名新表(
    t1\u backup
    -->
    t1
  • 实际代码如下:

    Connection cn = DriverManager.getConnection("jdbc:sqlite:"+path);
    Statement stmt = new Statement();
    stmt = cn.createConnection();
    stmt.execute("CREATE TABLE t1_backup(id);");
    stmt.executeUpdate("INSERT INTO t1_backup SELECT id FROM t1;");
    stmt.execute("DROP TABLE t1;");
    stmt.execute("ALTER TABLE t1_backup RENAME TO t1;");
    
    前两条语句执行时没有出现问题。但是当执行DROP TABLE语句时,它给了我
    java.sql.SQLException:[SQLITE\u LOCKED]数据库中的一个表被锁定(数据库表被锁定)

    我已经找到了一个解决办法,但我不知道为什么它会起作用。解决方案是再创建三个语句对象,将它们连接到同一数据库,并使用不同的语句对象执行四条SQL语句中的每一条:

    stmt.execute("CREATE ...");
    stmt2.executeUpdate("INSERT ...");
    stmt3.execute("DROP ...");
    stmt4.execute("ALTER ...");
    
    这可以解释吗

    我使用的JDBC是Xerial的


    谢谢。

    我倾向于通过调用JDBC驱动程序来解释这种行为。。。让我们说“古怪”。这可能与在SQLite中,DDL命令是非事务性的有关。您可以通过关闭
    连接上的自动提交
    并在执行插入后执行显式的
    commit()
    来尝试解决此问题。SQLite不应在事务结束后持有表锁,这应确保事务边界在您预期的位置。@John Bollinger感谢您的评论。我最终找到了一个更好的解决方案,即在执行DROP TABLE语句之前关闭连接并重新打开它。