JDBC批处理查询的高性能

sup*_*che 8 java mysql sql jdbc batch-file

我想做批处理查询DB以获得高性能,例如sql根据不同的customer_id进行查询:

select order_id, 
       cost 
from customer c 
  join order o using(id) 
where c.id = ... 
order by
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用JDBC语句来完成它.我知道我可以使用存储过程来实现这个目的,但是如果我可以在Java应用程序而不是SP中编写sql,那就更好了.
我正在使用DBCP作为我的Java客户端和MySQL DB.

Edw*_*rzo 10

JDBC 4.0规范描述了批量更新的机制.因此,JDBC中的批处理功能可用于插入或更新目的.这在说明书的第14章中描述.

AFAIK没有选择批处理的机制,可能是因为没有明显的需要,因为正如其他人所建议的那样,您可以通过正确构建查询来简单地检索所需的所有行.

int[] ids = { 1, 2, 3, 4 };
StringBuilder sql = new StringBuilder();
sql.append("select jedi_name from jedi where id in(");
for (int i = 0; i < ids.length; i++) {
    sql.append("?");
    if(i+1 < ids.length){
        sql.append(",");
    }
}
sql.append(")");
System.out.println(sql.toString());

try (Connection con = DriverManager.getConnection(...)) {

    PreparedStatement stm = con.prepareStatement(sql.toString());
    for(int i=0; i < ids.length; i++){
        stm.setInt(i+1, ids[i]);
    }

    ResultSet rs = stm.executeQuery();
    while (rs.next()) {
        System.out.println(rs.getString("jedi_name"));
    }

} catch (SQLException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

产量

select jedi_name from jedi where id in(?,?,?,?)
Luke, Obiwan, Yoda, Mace Windu
Run Code Online (Sandbox Code Playgroud)

你有没有理由认为你需要像批量选择语句这样的东西?