除非我关闭连接,否则编写语句的最后一批将不会被写入

时间:2010-08-13 09:37:22

标签: java sqlite jdbc

我正在做一个小项目,包括与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();

1 个答案:

答案 0 :(得分:1)

没有使用jdbc和sqlite,但这应该有效:

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

另外,请查看http://www.zentus.com/sqlitejdbc/,它有一个与您类似的好示例。