我在Java应用程序中使用SQlite。如果我运行我的程序,它会在某些时候出错。
有时在JVM发生致命错误的其他情况下这是一个简单的例外。
java.sql.SQLException:[SQLITE_MISUSE]库使用不正确(内存不足)
Java Runtime Environment检测到致命错误:
EXCEPTION_ACCESS_VIOLATION(0xc0000005)at pc = 0x000000006d587ab0,pid = 7036,tid = 6364
JRE版本:Java(TM)SE运行时环境(8.0_73-b02)(版本1.8.0_73-b02) Java VM:Java HotSpot(TM)64位服务器VM(25.73-b02混合模式windows-amd64压缩oops) 有问题的框架: C [sqlite-3.8.11.2-6df82281-eaf0-4204-a962-ce1e48ddd89f-sqlitejdbc.dll + 0x7ab0]
无法编写核心转储。默认情况下,在Windows的客户端版本
上未启用小型转储包含更多信息的错误报告文件保存为: C:\ Users \用户UltraMouse \工作空间\ co.windall.twitter \ hs_err_pid7036.log
如果您想提交错误报告,请访问: http://bugreport.java.com/bugreport/crash.jsp 崩溃发生在Java虚拟机外部的本机代码中。 查看有问题的框架,了解报告错误的位置。
导致此问题的代码行是
ResultSet rs = stmt.executeQuery("SELECT * FROM User WHERE id=" + id.toString() + ";");
它不一致,每次都发生在不同的点(这段代码在一个循环中),但它总是发生。
以下是我的完整源文件: http://pastebin.com/RKKVdNZ8 http://pastebin.com/fVaa93Rk
我每次都干净地运行它(我删除了数据库文件)。它目前在file1的第102行失败。
我不知道该怎么做:(
是的,那些推特键目前正常工作,但仅限于读取访问权限,我将它们留在那里,以便您可以在需要时试用该应用程序。
答案 0 :(得分:0)
很难确切地知道出了什么问题,但是你应该在每次操作后关闭你的陈述和sort(jitter(z))
。
最有可能导致你看到的内存泄漏:
ResultSet
应在每次新操作之前调用
Statement stmt = connection.createStatement();
每次操作后都应该调用。总结一下,你的主循环应如下所示:
stmt.close();
答案 1 :(得分:0)
每个Statement对象只能打开一个ResultSet对象 时间
因此,重用您的语句应该是问题,因为它隐式关闭了您的其他ResultSet
Statement接口中的所有执行方法都隐式关闭a statment当前的ResultSet对象(如果存在打开的对象)。
但是循环在某些情况下可能需要另一次已经关闭的ResultSet,因此会导致异常。
更新:
在我的代码中,我总是在尝试关闭它们之前检查ResultSet或Statements是否为!= null。
for (Long id : ids) {
Statement st, st2;
ResultSet rs;
Long ft = 0;
try {
st = connection.createStatement();
rs = st.executeQuery("SELECT * FROM User WHERE id=" + id.toString() + ";");
if (rs.next()) {
ft = rs.getLong("followedThem");
if (rs != null)
rs.close();
if (st != null)
st.close();
}
} catch (SQLException e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
e.printStackTrace();
System.err.println(id);
System.exit(0);
}
if (ft != 0) {
try {
st2 = connection.createStatement();
String sql = "";
if (ft != null && ft == -1) {
sql="UPDATE User SET followedThem=" + String.valueOf(Instant.now().getEpochSecond()) + " WHERE id=" + id.toString() + ";";
} else {
sql=String.format("INSERT INTO User (id,followedMe,followedThem,unfollowedMe,unfollowedThem,status) " +
"VALUES (%d, %d, %d, %d, %d, %d);", id, -1, Instant.now().getEpochSecond(), -1, -1, 0);
}
st2.executeUpdate(sql);
if (st2 != null)
st2.close();
} catch (SQLException e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
e.printStackTrace();
System.err.println(id);
System.exit(0);
}
}
}