2012-03-24 181 views
8

我想要做批量查询数据库的高性能,例如SQL来查询基于不同CUSTOMER_ID:JDBC批处理查询高性能

select order_id, 
     cost 
from customer c 
    join order o using(id) 
where c.id = ... 
order by 

我不知道如何使用JDBC语句来做到这一点。我知道我可以使用存储过程来达到这个目的,但是如果我可以在Java应用程序而不是SP中编写sql,会好很多。
我为我的Java客户端和MySQL DB使用DBCP。

+1

你的意思是什么“批量查询”?你可以使用'where c.id in(...)'获得多个客户。 – 2012-03-24 16:18:28

+0

我不知道你的意思是“为客户提供多个结果集”。 – 2012-03-24 16:38:36

+0

@a_horse_with_no_name我的意思是为一个客户设置一个结果集,不要混合返回行。 – superche 2012-03-24 16:45:44

回答

8

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

输出

select jedi_name from jedi where id in(?,?,?,?) 
Luke, Obiwan, Yoda, Mace Windu 

是否有任何理由,你为什么会认为你需要像分批select语句的事情?

+1

我目前的理论是对于选择(例如ResultSet),它们有一种“自动缓冲区“接下来的几行,所以他们”批量“免费选择。 FWIW – rogerdpack 2015-01-21 23:14:50

+1

@rogerdpack您的意思是[fetchSize](http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#setFetchSize-int-)属性?这可能会起作用,尽管文档声明可能只是数据库的一个提示。这并非所有驱动程序都必须实施它。 – 2015-01-21 23:34:44

+0

嘿,就是这样,谢谢你的链接!对于追随者,与Postgres出现你还需要自动提交关闭(奇怪):http://stackoverflow.com/questions/1468036/java-jdbc-ignores-setfetchsize – rogerdpack 2015-01-22 00:16:40

0

什么是您的SQL语句(您可以使用尽可能多的嵌套连接,因为您的数据库可以处理)真的没有关系。下面是基本的Java示例(不是DBCP)。对于非常相似的DBCP示例,您可以查看他们的example

Connection connect = DriverManager.getConnection(YOUR_CONNECTION_STRING); 
// Statements allow to issue SQL queries to the database 
Statement statement = connect.createStatement(); 

ResultSet resultSet = statement.executeQuery("select order_id, cost 
               from customer c 
               join order o using(id) 
               where c.id = ... 
              order by"); 
+1

我想要做批量查询,这意味着获取一个数据库查询的多个结果,像下面这样的sql语句:select order_id,cost from customer c join order o using(id)where c.id = 123 order by; select order_id,customer from customer c连接顺序o使用(id)where c.id = 456 order by; – superche 2012-03-24 16:43:58

+0

您可以将任何编译为'executeQuery()'的参数的sql语句提供给BTW:在您的示例中,2个查询可以合并为一个 – aviad 2012-03-24 16:46:11