gpt4 book ai didi

java - 除非我关闭连接,否则准备好的语句的最后一批不会被写入

转载 作者:行者123 更新时间:2023-12-01 16:02:28 25 4
gpt4 key购买 nike

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

此外,请查看 http://www.zentus.com/sqlitejdbc/其中有一个与您类似的很好的例子。

关于java - 除非我关闭连接,否则准备好的语句的最后一批不会被写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3475624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com