Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC批处理查询实现高性能_Java_Mysql_Sql_Jdbc_Batch File - Fatal编程技术网

Java JDBC批处理查询实现高性能

Java JDBC批处理查询实现高性能,java,mysql,sql,jdbc,batch-file,Java,Mysql,Sql,Jdbc,Batch File,我想批量查询数据库以获得高性能,示例sql以基于不同的客户id进行查询: select order_id, cost from customer c join order o using(id) where c.id = ... order by 我不知道如何使用JDBC语句来实现它。我知道我可以使用存储过程实现这一目的,但如果我可以在Java应用程序中编写sql而不是SP,那就更好了。 我将DBCP用于我的Java客户端和MySQL数据库。实际上,SQL语句是什么

我想批量查询数据库以获得高性能,示例sql以基于不同的客户id进行查询:

select order_id, 
       cost 
from customer c 
  join order o using(id) 
where c.id = ... 
order by
我不知道如何使用JDBC语句来实现它。我知道我可以使用存储过程实现这一目的,但如果我可以在Java应用程序中编写sql而不是SP,那就更好了。

我将DBCP用于我的Java客户端和MySQL数据库。

实际上,SQL语句是什么并不重要(您可以使用尽可能多的嵌套联接,只要DB可以处理)。下面是基本的Java示例(不是DBCP)。对于非常类似的DBCP示例,您可以查看它们的

描述了批量更新的机制。因此,JDBC中的批处理功能可用于插入或更新目的。本规范第14章对此进行了描述

此外,还没有选择批处理的机制,这可能是因为没有明显的必要,因为正如其他人所建议的那样,您可以通过正确构造查询一次检索所有需要的行

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

你有没有理由认为你需要一个批量选择语句之类的东西?< /P>“批量查询”到底是什么意思?您可以使用(…)中的

where c.id
来获取多个客户。我不知道“客户的多个结果集”是什么意思。@a_horse_with_no_name我是指一个客户的一个结果集,不要混合返回行。我想进行批处理查询,这意味着一个DB查询可以获得多个结果,sql语句如:select order_id,使用(id)从客户c加入订单o的成本,其中c.id=123 order by;选择order_id,客户c的成本使用(id)加入订单o,其中c.id=456 order by;您可以将任何编译为参数的sql语句提供给
executeQuery()
BTW:在您的示例中,2个查询可以合并为一个查询。我当前的理论是,对于select(以ResultSet为例),它们在运行时会自动缓冲接下来的几行,因此对于select,它们是免费“批处理”的。FWIW@rogerdpack你是说财产吗?这可能会起作用,尽管文档说明这可能只是对数据库的一个提示。这并不是所有的驱动程序都必须实现它。嘿,就是这样,谢谢你的链接!对于关注者,在Postgres出现时,您还需要关闭自动提交(奇怪):
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();
}
select jedi_name from jedi where id in(?,?,?,?)
Luke, Obiwan, Yoda, Mace Windu