我已经创建了一个Java软件,它利用sqlite数据库。整个数据库工作顺利,但经过一段时间的运行应用程序,我收到以下消息(从一个try catch块):
java.sql.SQLException:[SQLITE_忙碌]数据库文件被锁定(数据库被锁定)
我已经解决了我的问题,每次关闭软件异常上升。但是,有没有办法关闭我的数据库,而不是关闭软件每次?
我有很多疑问,但我的问题总是出现在一个特定的点:
try {
String query = "select * from StudentsSession where userId=? and course=? and level=?";
PreparedStatement pst = connectionUsers.prepareStatement(query);
pst.setString(1, saveUser.getText());
pst.setString(2, textSubjectQTest);
st.setString(3, showCurrentLevelLabel.getText());
ResultSet rs = pst.executeQuery();
while (rs.next()) {
count = count + 1;
}
pst.close();
rs.close();
} catch (Exception a) {
System.out.println(a);
}
try {
String countS, tmpS;
countS = String.valueOf(count);
sessionId.setText(countS);
long unixTime = System.currentTimeMillis() / 1000L;
tmpS = String.valueOf(unixTime);
date.setText(tmpS);
course.setText(textSubjectQTest);
String query = "insert into StudentsSession (userId,date,course,level,trial,score) values (?,?,?,?,?,-1)";
PreparedStatement pst = connectionUsers.prepareStatement(query);
pst.setString(1, saveUser.getText());
pst.setString(2, tmpS);
pst.setString(3, textSubjectQTest);
pst.setString(4, showCurrentLevelLabel.getText());
pst.setString(5, countS);
pst.executeUpdate();
pst.close();
} catch (Exception a) {
System.out.println(a);
System.exit(0);
}
String file1 = "";
ResultSet ts4;
try {
sessionId3 = "";
String query3 = "select * from studentssession where userid = ? and course = ? and level = ?";
PreparedStatement pst__1 = connectionUsers.prepareStatement(query3);
pst__1.setString(1, saveUser.getText());
pst__1.setString(2, textSubjectQTest);
pst__1.setString(3, showCurrentLevelLabel.getText());
ts4 = pst__1.executeQuery();
while (ts4.next()) {
sessionId3 = ts4.getString("sessionId");
}
pst__1.close();
ts4.close();
obj = new CaptureVideoFromWebCamera();
file1 = "videos/" + userTextFieldS.getText();
file1 = file1 + "_" + sessionId3;
file1 = file1 + ".wmv";
obj.start(file1);
} catch (Exception e4) {
e4.getCause();
}
字符串
有时这段代码会出现异常.
3条答案
按热度按时间tvokkenx1#
每次打开与SQLite数据库的连接时,请确保在处理结果等之后关闭数据库连接。如果您已经打开了与数据库的连接,并且如果您尝试再次获取连接并尝试一些
Update
或Insert
查询,系统将不会给予权限并将引发错误。kqhtkvqz2#
你的try catch是错误的,你试图在try块而不是finally块中关闭
ResultSet
和Statemnt
。这可能会导致泄漏。你应该这样做,在最后。
字符串
或者你可以看看Try-with-resource。
这可能是个原因
f0brbegy3#
排序重复现有的问题,但this is a good starting point。因为SQLite只是一个库,读取和写入文件系统上的文件,而不是一个完整的SQL数据库,你真的应该只有一个连接打开到它的时间。否则很容易进入竞争条件。
对于本地测试,它应该没问题,但是对于任何复杂的系统,需要多个用户,你应该使用像Postgre或MySQL这样的东西。