gpt4 book ai didi

java - 在嵌套循环中使用准备好的语句的最佳方法

转载 作者:行者123 更新时间:2023-11-30 08:06:36 25 4
gpt4 key购买 nike

在嵌套循环中执行多个查询时,最好的方法是什么?我有如下代码:

String sql1 = SQLContainer.SOME_SQL;
String sql2 = SQLContainer.SOME_SQL2;
if (someThings != null) {
for (Some some : someThings) {
ps = con.prepareStatement(sql1);
ps.setString(1, some.name);
ps.setString(2, some.type);
ps.executeUpdate();

if (some.getParams != null) {
for (Some2 some2 : some.params) {
ps = con.prepareStatement(sql2);
ps.setString(1, some2.name);
ps.setString(2, some2.value);
ps.setString(3, some2.type);
ps.executeUpdate();
}
}
}
}
  1. 这样使用可以吗?
  2. 我应该制作 2 个不同的循环,一个用于 sql1,一个用于 sql2?
  3. 我应该为不同的循环创建 2 种不同的方法吗?
  4. 或者我应该怎么做?

sqls 只是插入语句,两个 sqls 以某种方式相互关联。当我也从 some.params 得到错误时,我不想插入 somes。

最佳答案

除非你做得对,否则循环中的 SQL 性能会很差。

对于您的情况,我强烈建议使用批处理 SQL

您的第一个循环看起来像这样:

    int p1Count = 0;
int BATCHSIZE = 1000;
if (something) {
PreparedStatement ps1 = con.prepareStatement(SQLContainer.SOME_SQL);
for (Some some : someThing) {
ps1.setString(1, some.name);
ps1.setString(2, some.type);
ps1.addBatch();
if(++p1Count % BATCHSIZE == 0) {
ps1.executeBatch();
}
...
}
ps1.executeBatch();

同样,您应该将循环拆分为一次执行一种 SQL - 因此首先对一些 执行所有更新,然后(在第二个循环中) 为 some2

做所有更新

只要您将此保留在一次交易中,就可以了。

可以也可能保留嵌套代码 - 但是您的 s1 和 s2 计数器将是独立的,所以您真的不应该在自动提交打开的情况下这样做,因为没有办法告诉哪些项目已处理,哪些未处理。

在那种情况下,你最终会得到类似的东西

        int p1Count = 0;
int p2Count = 0;
int BATCHSIZE = 1000;
if (something) {
try(PreparedStatement ps1 = con.prepareStatement(SQLContainer.SOME_SQL);
PreparedStatement ps2 = con.prepareStatement(SQLContainer.SOME_SQL2)) {
for (Some some : someThing) {
ps1.setString(1, some.name);
ps1.setString(2, some.type);
ps1.addBatch();
if(++p1Count % BATCHSIZE == 0) {
ps1.executeBatch();
}
if (somethingElse) {
for (Some2 some2 : some.param) {
ps2.setString(1, some2.name);
ps2.setString(2, some2.value);
ps2.setString(3, some2.type);
ps2.addBatch();
if(++p2Count % BATCHSIZE == 0) {
ps2.executeBatch();
}
}
}
}
p2.executeBatch();
p1.executeBatch();
} //End try-with-resource
}

关于java - 在嵌套循环中使用准备好的语句的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268854/

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