在一个事务中执行两个不同的批处理查询和一个删除查询(Java)
我想问一下优化这三个查询的最佳方法。 这个功能将在一个国家项目中被数百万用户使用,我希望它尽可能优化(快速) 请添加任何有用的评论或回答:) 提前谢谢你在一个事务中执行两个不同的批处理查询和一个删除查询(Java),java,oracle,jdbc,ejb-3.1,Java,Oracle,Jdbc,Ejb 3.1,我想问一下优化这三个查询的最佳方法。 这个功能将在一个国家项目中被数百万用户使用,我希望它尽可能优化(快速) 请添加任何有用的评论或回答:) 提前谢谢你 try { //so we don't execute empty batches boolean flag=false; conn = dataSource.getConnection(); autoCommitValue = conn.getAutoCommit(); conn.setAutoCom
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
更好的名称,使代码更干净
然后我会测量,测试,看看我是否有性能问题。如果我有一个,我会努力找到它的来源。只有当我确信它来自这个方法(这不太可能),我才会尝试优化它
让我们假设这个方法需要优化。我要做的第一件事是确保存在适当的索引,以加快delete语句的速度
如果列表为空,那么我将避免准备这两个语句。您可以使用flag变量避免它们的执行,但不能避免它们的准备
然后,我会根据列表的大小、数据库的建议以及测量和测试的结果,尝试查看是否需要使用批处理,或者使用几个批处理是否有用
但正如我所说。做这一切都是过早的优化,这是万恶之源。在开始之前,尽量使代码正确、干净、可维护 我真的很抱歉命名和代码中的错误,我复制了我的原始代码,并不得不“屏蔽”它。我想我会选择这个作为我接受的答案,因为你对我提到了一个新的东西,那就是“过早优化”。谢谢你(T:)