2012-03-24 3 views
8

나는 다른 CUSTOMER_ID를 기반으로 쿼리에 고성능, 예를 들어, SQL에 대한 일괄 쿼리 DB를하고 싶지 :JDBC 배치 쿼리

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

내가 JDBC 문을 사용하여 작업을 수행하는 방법을 모르겠어요. 이 목적을 위해 저장 프로 시저를 사용할 수 있다는 것을 알고 있지만 SP가 아닌 Java 응용 프로그램에서 SQL을 작성할 수 있다면 훨씬 좋습니다.
자바 클라이언트와 MySQL DB에 DBCP를 사용하고 있습니다.

+1

"일괄 쿼리"란 정확히 무엇을 의미합니까? 둘 이상의 고객을 얻으려면'c.id in (...) '를 사용할 수 있습니다. –

+0

"고객을위한 다중 결과 세트"란 무엇을 의미하는지 모르겠습니다. –

+0

@a_horse_with_no_name 한 고객에 대해 하나의 결과 집합을 의미하며 반환 행을 혼합하지 마십시오. – superche

답변

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

내 현재 이론은 select (ResultSet의 경우)에 대해 "자동 버퍼 "다음 몇 줄을 가면 선택을 위해 무료로"일괄 처리 "됩니다. FWIW – rogerdpack

+1

@rogerdpack [fetchSize] (http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#setFetchSize-int-) 속성을 의미합니까? 문서가 데이터베이스에 대한 힌트일지도 모르겠지만 아마도 작동 할 것입니다. 그것은 모든 운전자가 반드시 그것을 구현하는 것은 아닙니다. –

+0

안녕하세요, 링크 덕분입니다. 추종자 들어, Postgres 함께 자동 연결 해제 (이상한) 나타납니다 나타납니다 : http://stackoverflow.com/questions/1468036/java-jdbc-ignores-setfetchsize – rogerdpack

0

SQL 문은 실제로 중요하지 않습니다 (DB에서 처리 할 수있는 중첩 된 조인을 많이 사용할 수 있음). 다음은 기본적인 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

하나의 DB 쿼리에 대해 여러 개의 결과를 얻는 것을 의미하는 일괄 쿼리를 수행하고자합니다. select order_id, 고객의 비용 C 조인 순서 o (id) using c.id = 123 order by; select order_id, customer from cost c (id)를 사용하여 order o를 조인합니다. 여기서 c.id = 456 order by; – superche

+0

'executeQuery()'에 인수로 컴파일 된 모든 SQL 문을 피드 할 수 있습니다. 예제 : 2 개의 쿼리를 하나의 쿼리로 통합 할 수 있습니다. – aviad