我正在编写一个从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插入查询,只修改循环的每次迭代的参数。但是,这并不意味着我应该在整个过程中保持与数据库的开放连接吗?这会以任何方式消极吗?
答案 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();