PreparedStatement上的SQL性能与保持打开的连接

时间:2017-10-19 14:53:19

标签: java mysql sql prepared-statement java-6

我正在编写一个从csv文件中读取行的程序,对于这些行中的每一行,它会针对一些其他数据检查不同的数据库,最后将新构造的数据插入到mysql DB中。

private void processLine(String line) throws ProcessLineException{
    ...
    insertData(foo, data);
}

private void insertData(String foo, String data) {
    Connection connection = null;
    PreparedStatement pStatement = null;
    try{
        connection = dataSource.getConnection();
        pStatement = connection.prepareStatement("INSERT INTO table VALUES(?,?)");
        pStatement.setString(1, foo);
        pStatement.setString(2, data);
    } catch(SQLException e){
        logger.error("Error when inserting data");
    } finally {
        try {
            pStatement.close();
            connection.close();
        } catch (SQLException e) {
            logger.warn("Couldn't close resources");
        }
    }
}

processLine

{{1}}

当我正在寻找一种更好的方法来处理SQLException时,我已经学到了一些关于PreparedStatements的东西(也可以得到一些帮助,上面的代码),而且我看到它的方式,我可以从使用PreparedStatement存储mysql插入查询,只修改循环的每次迭代的参数。但是,这并不意味着我应该在整个过程中保持与数据库的开放连接吗?这会以任何方式消极吗?

1 个答案:

答案 0 :(得分:1)

您正在分别执行每个查询。这会针对每个insert语句命中数据库。相反,你应该使用Statement的addBatch()方法,而不是像上面那样一个接一个地直接执行查询,并且在添加所有查询之后应该使用statement.executeBatch()方法一次性执行它们.eg

import java.sql.Connection;
import java.sql.Statement;

//...

Connection connection = new getConnection();
Statement statement = connection.createStatement();

for (Employee employee: employees) {
    String query = "insert into employee (name, city) values('"
            + employee.getName() + "','" + employee.getCity + "')";
    statement.addBatch(query);
}
statement.executeBatch();
statement.close();
connection.close();