Java-SQLite数据库在删除表时被锁定
我试图使用JDBC删除SQLite数据库表中的一列。由于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
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语句之前关闭连接并重新打开它。