使用JDBC的Java SQLException - SQLITE_MISUSE

时间:2016-03-14 19:52:25

标签: java sql sqlite jdbc twitter4j

我在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行失败。

我不知道该怎么做:(

是的,那些推特键目前正常工作,但仅限于读取访问权限,我将它们留在那里,以便您可以在需要时试用该应用程序。

2 个答案:

答案 0 :(得分:0)

很难确切地知道出了什么问题,但是你应该在每次操作后关闭你的陈述和sort(jitter(z))

最有可能导致你看到的内存泄漏:

ResultSet

应在每次新操作之前调用

Statement stmt = connection.createStatement();
每次操作后都应该调用

。总结一下,你的主循环应如下所示:

stmt.close();

答案 1 :(得分:0)

根据statement documentation

  

每个Statement对象只能打开一个ResultSet对象   时间

因此,重用您的语句应该是问题,因为它隐式关闭了您的其他ResultSet

  

Statement接口中的所有执行方法都隐式关闭a   statment当前的ResultSet对象(如果存在打开的对象)。

但是循环在某些情况下可能需要另一次已经关闭的ResultSet,因此会导致异常。

更新:

  1. 我会将两个语句的两个异常处理分开
  2. 我会使用两个语句对象
  3. 在我的代码中,我总是在尝试关闭它们之前检查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);
            }
        }
    }