0

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

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

 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);
}
4

1 回答 1

2

在尝试优化代码之前,我要做的第一件事就是让它编译。以下行不编译:

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

然后,我将通过尊重 Java 命名约定、将这个长方法分成几个方法以及使用比 . 更好的名称来使代码更简洁flag

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

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

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

然后我会尝试查看是否需要使用批处理,或者使用多个批处理是否有用,具体取决于列表的大小、我的数据库推荐的内容以及测量和测试的内容。

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

于 2013-05-08T17:31:12.183 回答