2009-03-04 2 views
1

성능 향상을 위해 애플리케이션의 왕복을 줄이려고합니다. 많은 혜택을 얻으려면 PreparedStatement을 사용하고 싶습니다. SQL : 바운드 변수로 문을 일괄 처리하기

Class.forName("..Driver"); 
    Connection connection = DriverManager.getConnection(..);  
    PreparedStatement statement = connection.prepareStatement("UPDATE Table SET XmlData = ? WHERE SomeGUID = ?; INSERT INTO SomeTable (Col1,Col2) VALUES (?, ?)"); 

    try{ 
    statement.setString(1, "<XmlData></XmlData>"); 
    statement.setString(2, "32ABD5-438B0-.."); 
    statement.setString(3, "ABC"); 
    statement.setString(4, "XYZ"); 
    statement.execute(); 
    connection.commit(); 
    } 
    catch { 
    connection.rollback(); 
    } 
    finally { 
    statement.close(); 
    connection.close(); 
    } 

(다시 말하지만, 이것은 실제 코드, 그냥 간단한 예 아니다) .. 내가 .. 생략 세부 사항을 일반화 가지고 올 한 내용의 예입니다

일반적으로 왕복 트래픽을 줄이기 위해 단일 명령문에서 여러 삽입/업데이트 문을 실행하려고합니다. 이것은 효과적인 방법인가요? 아니면 더 받아 들여진 접근 방법이 있습니까?

단일 트랜잭션에 대해 수천 개의 명령문을 사용할 수 있습니다. 단일 문장의 실행 시간 초과를 막기 위해 합리적으로 크기가 조정 된 블록으로 구문을 분할합니다.

여러 DB 공급 업체를 지원할 예정이지만 ANSI SQL을 사용하므로 문제가 발생하지 않습니다. 필요한 경우 DAL 정보를 활용할 수 있습니다. 그래서, 이것은 문제가 아닙니다.

팁/제안 사항?

답변

0

PreparedStatementaddBatchexecutebatch을 사용하여 다른 인수를 사용하여 동일한 명령문을 제출하는 배치를 지원합니다. 필자는 데이터베이스 간 플랫폼 방식으로 여러 매개 변수가있는 명령문을 실행하는 좋은 방법이 있다고 생각하지 않습니다. 전통적으로 이것은 [악의] 저장된 procs에 의해 처리 될 것입니다.

2

다음은 Oracle JDBC 매뉴얼의 예제입니다. 이것은 "표준"(Oracle 이외의) 방법으로 설명됩니다. 그런데

PreparedStatement pstmt = 
      conn.prepareStatement("INSERT INTO employees VALUES(?, ?)"); 

pstmt.setInt(1, 2000); 
pstmt.setString(2, "Milo Mumford"); 
pstmt.addBatch(); 

pstmt.setInt(1, 3000); 
pstmt.setString(2, "Sulu Simpson"); 
pstmt.addBatch(); 
... 
int[] updateCounts = pstmt.executeBatch(); 
1

,이 경우는 peformance에 대해 우려 재, 당신은 또한 PreparedStatement의 풀링을 지원 dbcp 같은 연결 풀링 패키지를 사용하는 것이 좋습니다. c3p0도 인기가 있지만 어떤 경험도 없습니다.

관련 문제