Hello Everyone,
I have two unrelated tables table_A and table_B in my SQLite DB. Trying to
drop table_B while a resultset is open on table_A throws
"java.sql.SQLException: database table is locked".
Following simple code will illustrate the Bug clearly.
public class Class1 {
public static void main(String[] args) throws Exception {
Class.forName("org.sqlite.JDBC");
Connection c = DriverManager.getConnection("jdbc:sqlite:" +
"D:\\test.db");
Statement stmt1 = c.createStatement();
stmt1.executeUpdate("create table table_A (col1 text)");
stmt1.executeUpdate("insert into table_A values ('FIRST')");
stmt1.executeUpdate("create table table_B (col1 text)");
PreparedStatement ps = c.prepareStatement("select * from table_A");
ResultSet rs = ps.executeQuery();
//While the resultset is open on table_A try to
//drop table_B. It gives error that database table is locked
//Which makes no sense because there is no relation between
//table_A and table_B
stmt1.executeUpdate("drop table if exists table_B");
rs.close();
stmt1.close();
c.close();
}
}
*Some other details*
1. My Java version is 1.8.0_72.
2. I have tried this with sqlite-jdbc-3.8.11.2.jar as well as
sqlite-jdbc-3.7.2.jar. But the result is same.
3. Following are some of the other things that I tried which made no
difference.
1. Setting auto-commit on or off
2. Searched bug-list and googled but all hits are for "database is
locked" but nothing for "database *table* is locked"
3. Using try-catch-finally to properly close all resources in case of
exception.
4. Closing the connection and reopening it before "Preparedstatement
ps ...".
5. Tried to use another connection to drop the table_B. This
expectedly gave "database is locked" error.
4. My actual scenario is that I have meta-data in one table based on
which I need to drop other tables. So I need to drop other tables while
processing resultset from meta-data table.