Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最后一批准备好的STATANT won#x27;除非我关闭连接,否则我不会被写入_Java_Sqlite_Jdbc - Fatal编程技术网

Java 最后一批准备好的STATANT won#x27;除非我关闭连接,否则我不会被写入

Java 最后一批准备好的STATANT won#x27;除非我关闭连接,否则我不会被写入,java,sqlite,jdbc,Java,Sqlite,Jdbc,我正在做一个小项目,包括连接到sqlite。我使用一对多关系向两个表写入数据 除非显式关闭连接,否则无法写入第二个表的最后一批。我觉得很奇怪,因为数据库处于自动提交模式(即connection.commit()抛出错误) 我希望保持连接打开,因为我将对write方法进行多次调用 除了commit()之外,我还能做什么来强制写入磁盘 这里有一个非常简单的代码示例,请注意,如果我取消对conn.close()的注释,它将按我所希望的方式工作 Class.forName("org.sqlite.JDB

我正在做一个小项目,包括连接到sqlite。我使用一对多关系向两个表写入数据

除非显式关闭连接,否则无法写入第二个表的最后一批。我觉得很奇怪,因为数据库处于自动提交模式(即connection.commit()抛出错误)

我希望保持连接打开,因为我将对write方法进行多次调用

除了commit()之外,我还能做什么来强制写入磁盘

这里有一个非常简单的代码示例,请注意,如果我取消对conn.close()的注释,它将按我所希望的方式工作

Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:result");
Statement stat = conn.createStatement();

stat.executeUpdate("create table if not exists " +
            "a (a1, aID INTEGER PRIMARY KEY ASC)");

stat.executeUpdate("create table if not exists " +
            "b (aID, b1, attributePathID INTEGER PRIMARY KEY ASC)");

PreparedStatement pa = conn.prepareStatement(
            "insert into a (a1) values (?);");

PreparedStatement pb = conn.prepareStatement(
            "insert into b (aID,b1) values (?,?);");

int[] aSet = new int[] {10,20,30};
int[] bSet = new int[] {1,2};


for(int ai : aSet){
    pa.setInt(1,ai);
    pa.execute();

    ResultSet rs = pa.getGeneratedKeys();
    rs.next();
    long aID = rs.getLong(1);

    for(int bi : bSet){
        pb.setLong(1,aID);
        pb.setInt(2,bi);
        pb.execute();
        }
    }
    //conn.close();

虽然没有太多使用jdbc和sqllite,但这应该可以:

conn.setAutoCommit(false);
for(int bi : bSet){
    pb.setLong(1,aID);
    pb.setInt(2,bi);
    pb.executeUpdate();
    }
conn.commit();
conn.setAutoCommit(true);

另外,看看哪个示例与您的示例类似。

在conn.commit()上抛出SQLException“SQL逻辑错误或缺少数据库”;一行但是你链接中的例子起了作用。引发异常,因为ResultSet仍处于打开状态。因此,只需添加一个修复程序和rs.close()就可以了。