준비된 진술서, 상환청구서 및 성과 고려사항
나는 있습니다oracle stored proc
내 자바 프로그램에서 호출해야 합니다.사용한 적이 있습니다.CallableStatement
매개 변수를 저장된 프로시저에 전달합니다.Oracle Thin Driver(웹 로직 서버에서 관련 jndi 항목에 대해 구성됨)를 사용하고 있습니다.저장된 이 프로시저에 OUT 값이 없습니다.이 저장된 proc는 숫자 값을 허용하고 수신된 값을 기준으로 db에서 많은 업데이트를 수행합니다.
저는 연결 객체를 받은 다음 이 저장된 procin 루프를 호출합니다(20개의 숫자를 전달하기 위해 20번).오라클 클라이언트에서 이 저장된 proc를 직접 호출하면 2-3초 안에 실행이 완료됩니다.하지만 내 자바 코드로는 그 행동을 예측할 수 없습니다.일부 통화는 완료되는 데 30-40초가 걸립니다.
사용하려고 했습니다.PreparedStatement
대신에CallableStatement
(동작이 여전히 일관되지 않지만) 한계 성능 향상을 볼 수 있습니다.
- 제 경우에는 사용해도 괜찮습니까?
PreparedStatement
대신에CallableStatement
저장된 프로세스에 OUT 매개 변수가 없다는 것을 고려할 때? - 무슨 이유라도 있습니까?
PreparedStatement
에 비해 약간의 성능 향상 효과가 있습니다.CallableStatement
아니면 제가 잘못 관찰했을 수도 있는 것인가요? - 이 성능 문제를 해결할 수 있는 더 나은 방법이 있습니까?
당신의 의견에서, 당신은 당신의 루프 안에 통화를 준비했습니다.준비된 문(및 호출 가능한 문)의 장점은 한 번 준비한 다음 매개 변수에 전달된 값을 바꿀 수 있다는 것입니다. 호출이 준비될 때마다 오버헤드가 발생하므로 루프 밖으로 가져올 수 있으면 실행 시간이 감소할 수 있습니다.각 커밋에는 오버헤드가 있으므로 자동 커밋을 해제하는 것도 도움이 될 수 있습니다.
conn.setAutoCommit(false);
CallableStatement stmt = conn.prepareCall(sql);
while(true) {
stmt.setInt(1, value);
stmt.execute();
}
conn.commit();
conn.setAutoCommit(true);
(conn.setAutoCommit(true)
커밋하지만, 명시적인 것이 더 명확합니다.)
배치를 사용하는 것을 고려해야 하지 않나요?
conn.setAutoCommit(false);
CallableStatement stmt = conn.prepareCall(sql);
while(true) {
stmt.setInt(1, value);
stmt.addBatch();
}
stmt.executeBatch()
conn.commit();
언급URL : https://stackoverflow.com/questions/8747937/preparedstatement-callablestatement-and-performance-considerations
'programing' 카테고리의 다른 글
j변수에 로드 쿼리 (0) | 2023.09.01 |
---|---|
jQuery AJAX 오류를 어떻게 잡을 수 있습니까? (0) | 2023.09.01 |
교차 도메인 iframe의 DOM 콘텐츠 가져오기 (0) | 2023.09.01 |
jQuery 자동 완성 및 ASP.NET (0) | 2023.09.01 |
아약스 vs.웹 소켓 대웹 작업자 (0) | 2023.09.01 |