JDBC
후회할 걸 알지만, 견디지 못할 땐 나도 어쩔수 없다. 사람이라.
JDBC
-
JDBC의 PreparedStatement와 Statement 쿼리의 내용이 바뀌지 않고 인자 값만 바뀌는 경우 미리 컴파일된 PreparedStatement가 더 유리하다. 쿼리의 내용이 조금씩 변형이 될 경우에는 PreparedStatement가 더 유리하다. PreparedStatement는 정적 SQL 조회를 처리하는 데 Statement가 사용되는 동적 SQL 조회를 처리하는 데 사용된다.
-
createStatement Statement는 DBMS에 설정된 OPEN CURSORS개수만큼 생성 가능. OPEN CURSORS란 하나의 커넥션(세션)에서 수행할 수 있는 Statement 개수 Statement가 OPEN CURSORS보다 많으면 “Open Cursors exceed”라는 예외 발생. 그러므로 Statement를 다 사용한 뒤에 필히 닫아주어야 한다.
-
PreparedStatement DBMS는 가장 최근에 수행된 SQL문장을 저장하고 있다가, 똑같은 SQL이 반복하여 들어올 경우에 별다른 수행계획없이 이전의 수행계획으로 SQL를 실행한다. 이때 속도가 빨라지게 된다. PreparedStatement는 이러한 DBMS기능을 통하여 반복적인 SQL실행에서 사용되어 어플리케이션의 성능을 향상시킨다.
-
CallableStatement DBMS의 Stored Procedure호출에 사용된다
-
Batch 업데이트
- createStatement
try {
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("SQL 문1");
stmt.addBatch("SQL 문2");
....
// 각 업데이트가 몇개의 행에 영향을 끼쳤는가?
int [] uprowcount = stmt.executeBatch(); // SQL문장 실행
con.commit();
} catch (BatchUpdateException be) {
// 예외 발성 전까지 성공적으로 수행된 문장 개수
int updatedCount = be.getUpdateCounts().length;
// 각 업데이트가 몇개의 행에 영향을 끼쳤는가?
int [] updateCount = be.getUpdateCounts();
}
- PreparedStatement
PreparedStatement pstmt = con.prepareStatement("....");
pstmt.setString(1,"ABC");
pstmt.setInt(2,2000);
pstmt.addBatch(); // 지금까지 입력된 데이터를 배치 작업에 추가
pstmt.setString(1, "DEF");
pstmt.setInt(2, 3000);
pstmt.addBatch();
....
int [] uprowcount = pstmt.executeBatch();
JDBC Transaction 처리
- 트랜잭션 처리 방법
Connection.setAutoCommit(true) // true or false
Connection.commit();
Connection.rollback();
-
Transaction 고립 레벨
- TRANSACTION_NONE : 트랜잭션 지원 안함
- TRANSACTION_READ_UNCOMMITTED : 커밋되지 않은 데이터도 볼 수 있음
- TRANSACTION_READ_COMMITTED : 커밋된 데이터만 볼 수 있음
- TRANSACTION_REPEATABLE_READ : dirty reads와 nonrepeatable reads 방지. phantom reads는 방지 못함
- TRANSACTION_SERIALIZABLE : dirty/nonrepeatable/phantom reads 모두 방지
- Connection.setTransactionIsolation(int level) : 고립 레벨 지정. 커넥션을 닫거나 재지정할 때 까지 유지
- DatabaseMetaData.surpportsTransactionIsolationLevel(int level) : 고립 레벨 지원 여부 확인
-
SavePoints
- SavePoints 는 트랜잭션 작업 사이에 SavePoint를 정의해 두고 지정된 SavePoint로부터의 작업들을 커밋이나 롤백할 수 있도록 한다
- DatabaseMetaData.supportsSavePoints() : SavePoints 지원 여부
- Savepoint sp1 = con.setSavepoint(“SP1”) : SavePoint 지정
- con.rollback(sp1) : 지정된 SavePoint까지 롤백