数据库文件已锁定(SQL Java 中的异常)
Database file is locked (SQL Exception in Java)
在我的代码中,每当我调用以下函数时,都可以访问数据库 Emitter。该函数基本上是从数据库中提取数据并将其存储在变量中。
public void fillEmitterDataLists()
{
EmitterStructVo emitter = new EmitterStructVo();
try {
stmt = dbConn.createStatement();
rs = stmt.executeQuery( "SELECT * FROM Emitter;" );
while ( rs.next() ) {
emitter = new EmitterStructVo();
model.emitterList.add(rs.getString("E_ID"));
String pri = rs.getString("PRI_ID");
String pw = rs.getString("PW_ID");
String rf = rs.getString("RF_ID");
String reps = rs.getString("Reps");
String interval = rs.getString("Interval");
Statement stmt1;
stmt1 = dbConn.createStatement();
ResultSet rs1 = stmt1.executeQuery("SELECT * FROM PRI where PRI_ID = '" + pri + "';");
model.priList.add(rs1.getString("PRI_Values"));
int priType = Integer.parseInt(rs1.getString("PRI_TYPE"));
rs1 = stmt1.executeQuery("SELECT * FROM PW where PW_ID = '" + pw + "';");
model.pwList.add(rs1.getString("PW_Values"));
rs1 = stmt1.executeQuery("SELECT * FROM RF where RF_ID = '" + rf + "';");
model.rfList.add(rs1.getString("RF_Values"));
stmt1.close();
rs1.close();
}
stmt.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
但是如果我在调用上面的函数后执行下面的代码,就会报Emitter数据库文件被锁定的错误。然而,如果我之前不调用上述函数,则以下代码可以正常运行。所以,很明显,问题出在 fillEmitterDataLists() 函数上。
Class.forName("org.sqlite.JDBC");
Connection dbConn = DriverManager.getConnection("jdbc:sqlite:FssDb.db");
Statement stmt = dbConn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM Emitter where E_ID = '" + name + "';");
现在我已经关闭了堆栈溢出的类似问题中建议的所有语句和结果集,所以我不知道为什么它仍然产生异常。
请帮忙?
基于这篇关于多线程和 SQLITE 的answer。
您会发现 SQlite 不支持多连接。原因是每当您在数据库上请求连接时,都会在该文件上设置一个锁,您需要关闭连接以释放该锁。只有这样你才能打开一个新的连接。
因此您要么必须关闭上述方法中提供的 dbConn
,要么只是共享连接。
我建议您查看 Singleton pattern
以正确管理连接。
SQLite 对文件锁定特别挑剔。也尝试关闭连接,以便每个函数打开自己的连接,使用它并在之后关闭它。看看 this answer 是否对你有帮助。
在我的代码中,每当我调用以下函数时,都可以访问数据库 Emitter。该函数基本上是从数据库中提取数据并将其存储在变量中。
public void fillEmitterDataLists()
{
EmitterStructVo emitter = new EmitterStructVo();
try {
stmt = dbConn.createStatement();
rs = stmt.executeQuery( "SELECT * FROM Emitter;" );
while ( rs.next() ) {
emitter = new EmitterStructVo();
model.emitterList.add(rs.getString("E_ID"));
String pri = rs.getString("PRI_ID");
String pw = rs.getString("PW_ID");
String rf = rs.getString("RF_ID");
String reps = rs.getString("Reps");
String interval = rs.getString("Interval");
Statement stmt1;
stmt1 = dbConn.createStatement();
ResultSet rs1 = stmt1.executeQuery("SELECT * FROM PRI where PRI_ID = '" + pri + "';");
model.priList.add(rs1.getString("PRI_Values"));
int priType = Integer.parseInt(rs1.getString("PRI_TYPE"));
rs1 = stmt1.executeQuery("SELECT * FROM PW where PW_ID = '" + pw + "';");
model.pwList.add(rs1.getString("PW_Values"));
rs1 = stmt1.executeQuery("SELECT * FROM RF where RF_ID = '" + rf + "';");
model.rfList.add(rs1.getString("RF_Values"));
stmt1.close();
rs1.close();
}
stmt.close();
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
但是如果我在调用上面的函数后执行下面的代码,就会报Emitter数据库文件被锁定的错误。然而,如果我之前不调用上述函数,则以下代码可以正常运行。所以,很明显,问题出在 fillEmitterDataLists() 函数上。
Class.forName("org.sqlite.JDBC");
Connection dbConn = DriverManager.getConnection("jdbc:sqlite:FssDb.db");
Statement stmt = dbConn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM Emitter where E_ID = '" + name + "';");
现在我已经关闭了堆栈溢出的类似问题中建议的所有语句和结果集,所以我不知道为什么它仍然产生异常。
请帮忙?
基于这篇关于多线程和 SQLITE 的answer。
您会发现 SQlite 不支持多连接。原因是每当您在数据库上请求连接时,都会在该文件上设置一个锁,您需要关闭连接以释放该锁。只有这样你才能打开一个新的连接。
因此您要么必须关闭上述方法中提供的 dbConn
,要么只是共享连接。
我建议您查看 Singleton pattern
以正确管理连接。
SQLite 对文件锁定特别挑剔。也尝试关闭连接,以便每个函数打开自己的连接,使用它并在之后关闭它。看看 this answer 是否对你有帮助。