gpt4 book ai didi

java - 在一个事务中执行两个不同的批量查询和一个删除查询 (Java)

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

我想问一下优化这三个查询的最佳方法。该功能将在一个国家项目中被数百万用户使用,我希望它尽可能优化(快速)。

请添加任何有用的评论或答案:)提前谢谢您。

 try {
//so we don't execute empty batches
boolean flag=false;
conn = dataSource.getConnection();
autoCommitValue = conn.getAutoCommit();
conn.setAutoCommit(false);
stmt = conn.prepareStatement("DELETE FROM table1 WHERE input = ?");
stmt.setLong(1, input);
stmt.executeUpdate();
stmt = conn
.prepareStatement("INSERT INTO table1 (c1) values (?)");

for (Object Info : Info List) {
if (Info .getType() == 0) {
flag=true;
stmt.setInt(1, Info.getC1());
stmt.addBatch();
}
}
if(flag){
result = stmt.executeBatch();
flag=false;
}
stmt = conn.prepareStatement("INSERT INTO table1 (c1,c2,c3) values (?,?,?)");

for (Object Info : Info List) {
if (Info .getType() != 0) {
flag=true;
stmt.setLong(1, input);
stmt.setInt(2, Info.getC1());
stmt.setInt(3, resInfo.getC2());
stmt.addBatch();
}
}
if(flag){
result = stmt.executeBatch();
}
conn.commit();

} catch (SQLException e) {
conn.rollback();
throw new SQLException();
} finally {
if (conn != null) {
// now we return the connection to its original state
conn.setAutoCommit(autoCommitValue);
}
closeDBObjects(conn, stmt);
}

最佳答案

在尝试优化代码之前,我要做的第一件事就是使其能够编译。以下几行无法编译:

for (Object Info : Info List) {
if (Info .getType() != 0) {
...

然后,我将通过尊重 Java 命名约定、将这个长方法拆分为多个方法以及使用比 flag 更好的名称等方式使代码更加简洁。

然后我会测量、测试并查看是否存在性能问题。如果我有一个,我会尽力找到它的来源。只有当我确定它来自这种方法(这不太可能)时,我才会尝试优化它。

假设这个方法需要优化。我要做的第一件事是确保存在适当的索引,以加快删除语句的速度。

如果列表为空,我将避免准备这两个语句。您可以使用标志变量来避免它们的执行,但不能避免它们的准备工作。

然后我会尝试看看是否有必要使用一批,或者使用多个批处理是否有用,具体取决于列表的大小、我的数据库的建议以及测量和测试的结果。

但正如我所说。做这一切都是过早的优化,这是万恶之源。之前尽量让代码正确、干净、可维护。

关于java - 在一个事务中执行两个不同的批量查询和一个删除查询 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16443921/

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