LEC:Spring JDBC 및 Transaction

Download Report

Transcript LEC:Spring JDBC 및 Transaction

Spring JDBC
Spring Framework – JDBC
Spring JDBC를 이용할 때 개발자들이 구현할 부분
작업
Spring JDBC
개발자
Connection 관리
O
X
SQL
X
O
Statement 관리
O
X
ResultSet 관리
O
X
Row 데이터 추출
X
O
패러미터 선언
X
O
패러미터 Setting
O
X
트랜잭션 관리
O
X
Spring Framework – JDBC
Template Method
Pattern
Spring Framework – JDBC
Spring Framework – JDBC
public abstract class AbstractClass {
public void templateMethod() {
// .. 비지니스 로직 구현
operation1();
// .. 비지니스 로직 구현
operation2();
}
protected abstract void operation1();
protected abstract void operation2();
}
Spring Framework – JDBC
public class ConcreteClassA extends AbstractClass {
protected void operation1() {
// TODO Auto-generated method stub
}
protected void operation2() {
// TODO Auto-generated method stub
}
}
Spring Framework – JDBC
Template Method = IoC
Spring Framework – JDBC
Callback Class
Callback Method
Spring Framework – JDBC
public interface RowCallbackHandler {
void processRow(ResultSet rs) throws SQLException;
}
Spring Framework – JDBC
public void query(String sql, RowCallbackHandler callbackHandler)
throws JdbcSqlException {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = <code to get connection>
ps = con.prepareStatement (sql);
rs = ps.executeQuery();
while (rs.next()) {
callbackHandler.processRow(rs);
}
rs.close();
ps.close();
} catch (SQLException ex) {
throw new JdbcSqlException("Couldn't run query [" + sql + "]", ex);
}
finally {
DataSourceUtils.closeConnectionIfNecessary(this.dataSource, con);
}
}
Spring Framework – JDBC
class StringHandler implements JdbcTemplate.RowCallbackHandler {
private List 1 = new LinkedList();
public void processRow(ResultSet rs)throws SQLException {
1.add(rs.getString(1));
}
public String[] getStrings() {
return (String[]) 1.toArray(new String[1.size()]);
}
}
StringHandler sh = new StringHandler();
jdbcTemplate.query("SELECT FORENAME FROM CUSTMR", sh);
String[] forenames = sh.getStrings();
Spring Transaction
Spring Framework – Transaction
Persistence Layer
Where?
Business Layer
Spring Framework – Transaction
Spring Framework – Transaction
TXa
TXa
TXa
Spring Framework – Transaction
TXa
TXa
TXa
TXa
TXb
TXb
Spring Framework – Transaction
Transaction – Isolation Level
격리 레벨(Isolation Level)
상세 설명
TransactionDefinition.ISOLATIO
N_DEFAULT
개별적인 PlatformTransactionManager를 위한
디폴트 격리레벨
TransactionDefinition.ISOLATIO
N_READ_UNCOMMITTED
격리레벨중 가장 낮은 격리 레벨이다. 이 격리레벨
은 다른 Commit되지 않은 트랜잭션에 의해 변경
된 데이터를 볼 수 있기 때문에 거의 트랜잭션의
기능을 수행하지 않는다.
TransactionDefinition.ISOLATIO
N_READ_COMMITTED
대개의 데이터베이스에서의 디폴트로 지원하는
격리 레벨이다. 이 격리 레벨은 다른 트랜잭션에
의해 Commit되지 않은 데이터는 다른 트랜잭션에
서 볼 수 없도록 한다. 그러나 개발자들은 다른 트
랜잭션에 의해 입력되거나 수정된 데이터는 조회
할 수는 있다.
TransactionDefinition.ISOLATIO
N_REPEATABLE_READ
ISOLATION_READ_COMMITED 보다는 다소 조
금 더 엄격한 격리레벨이다. 이 격리레벨은 다른
트랜잭션이 새로운 데이터를 입력했다면, 새롭게
입력된 데이터를 조회할 수 있다는 것을 의미한다.
TransactionDefinition.ISOLATIO
N_SERIALIZABLE
가장 많은 비용이 들지만 실뢰할만한 격리레벨을
제공하는 것이 가능하다. 이 격리레벨은 하나의 트
랜잭션이 완료된 후에 다른 트랜잭션이 실행하는
것처럼 지원한다.
Transaction – Isolation Level
TXa
TXb
Transaction – Isolation Level
TXa
SELECT CATEGORYNAME FROM ORDER WHERE ORDERID = 1
Result
“BOOK”
UPDATE ORDER SET CATEGORYNAME=“MUSIC” WHERE
ORDERID = 1
TXb
TXa
SELECT CATEGORYNAME FROM ORDER WHERE ORDERID = 1
Result
?
Transaction – Isolation Level
Dirty Read
TXa
SELECT CATEGORYNAME FROM ORDER WHERE ORDERID = 1
Result
“BOOK”
UPDATE ORDER SET CATEGORYNAME=“MUSIC” WHERE
ORDERID = 1
TXb
TXa
SELECT CATEGORYNAME FROM ORDER WHERE ORDERID = 1
Result
“MUSIC”
Transaction – Isolation Level
NonRepeatable Read(Fuzzy Read) – Update, Delete
TXa
SELECT CATEGORYNAME FROM ORDER WHERE ORDERID = 1
Result
“BOOK”
UPDATE ORDER SET CATEGORYNAME=“MUSIC” WHERE
ORDERID = 1
TXb
TXa
SELECT CATEGORYNAME FROM ORDER WHERE ORDERID = 1
Result
“BOOK”
Transaction – Isolation Level
NonRepeatable Read(Fuzzy Read) – Update, Delete
Commit
TXb
TXa
SELECT CATEGORYNAME FROM ORDER WHERE ORDERID = 1
Result
“MUSIC”
Transaction – Isolation Level
Phantom Read - Insert
TXa
SELECT COUNT(*) FROM ORDER
Result
10
TXb
INSERT INTO ORDER (ORDERID, CATEGORYNAME) VALUES (
11, “GAME”
TXa
SELECT COUNT(*) FROM ORDER
Result
10
Transaction – Isolation Level
Phantom Read - Insert
Commit
TXb
TXa
SELECT COUNT(*) FROM ORDER
Result
11
Transaction – Isolation Level
Isolation Level
Dirty Read
NonRepetable Read
Phantom Read
Read uncommitted
(ISOLATION_READ_U
NCOMMITTED)
Possible
Possible
Possible
Read committed
(ISOLATION_READ_C
OMMITTED)
Not Possible
Possible
Possible
Repetable read
(ISOLATION_REPEAT
ABLE_READ)
Not Possible
Not Possible
Possible
Serializable
(ISOLATION_SERIALI
ZABLE)
Not Possible
Not Possible
Not Possible
Transaction – Propagation Behavior
전달 행위(Propagation Behavior)
상세설명
TransactionDefinition.PROPAGATION_REQUIRED
이미 하나의 트랜잭션이 존재한다면 그 트
랜잭션을 지원하고, 트랜잭션이 없다면, 새
로운 트랜잭션을 시작한다.
TransactionDefinition.PROPAGATION_
SUPPORTS
이미 트랜잭션이 존재한다면 그 트랜잭션
을 지원하고, 트랜잭션이 없다면 비-트랜잭
션 형태로 수행한다.
TransactionDefinition.PROPAGATION_
MANDATORY
이미 트랜잭션이 존재한다면 그 트랜잭션
을 지원하고 활성화된 트랜잭션이 없다면
예외를 던진다.
TransactionDefinition.PROPAGATION_
REQUIRES_NEW
언제나 새로운 트랜잭션을 시작한다. 이미
활성화된 트랜잭션이 있다면, 일시정지한다.
TransactionDefinition.PROPAGATION_
NOT_SUPPORTED
활성화된 트랜잭션을 가진 수행을 지원하
지 않는다. 언제나 비-트랜잭션적으로 수행
하고 존재하는 트랜잭션은 일시정지한다.
TransactionDefinition.PROPAGATION_
NEVER
활성화된 트랜잭션이 존재하더라도 비-트
랜잭션적으로 수행한다. 활성화된 트랜잭션
이 존재한다면 예외를 던진다.
TransactionDefinition.PROPAGATION_
NESTED
활성화된 트랜잭션이 존재한다면 내포된
트랜잭션으로 수행된다. 작업수행은
TransactionDefinition.PROPAGATION_
REQUIRED으로 셋팅된것처럼 수행된다.
Transaction – Propagation Behavior
PROPAGATION_REQUIRED
TXa
TXa
TXa
TXa
PROPAGATION_REQUIRED
Transaction – Propagation Behavior
PROPAGATION_REQUIRED
TXa
TXa
TXb
TXb
PROPAGATION_REQUIRES_NEW
Transaction – Propagation Behavior
PROPAGATION_REQUIRED
TXa
TXa
TXa
TXa
PROPAGATION_SUPPORTS
Transaction – Propagation Behavior
PROPAGATION_SUPPORTS
Transaction – Propagation Behavior
PROPAGATION_REQUIRED
TXa
PROPAGATION_NOT_SUPPORTED
TXa
Transaction – Propagation Behavior
PROPAGATION_REQUIRED
TXa
TXa
TXa
TXa
PROPAGATION_MADATORY
Transaction – Propagation Behavior
Throw Exception
PROPAGATION_MADATORY
Transaction – Propagation Behavior
PROPAGATION_REQUIRED
TXa
TXa
Throw Exception
PROPAGATION_NEVER
Spring Framework – Transaction
전달 행위
(필수)
readOnly 유무
(선택)
PROPAGATION, ISOLATION, readOnly, -Exceptions, +Exceptions
격리 레벨
(선택)




Rollback 규칙
(선택)
전달 행위 : 필수 값으로서 Spring 프레임워크 전달행위 중의 하나를 사용할 수 있다.
격리 레벨 : 선택 값으로 Spring 프레임워크 격리 레벨 중의 하나를 사용할 수 있다.
readOnly : 선택 값으로 실행하는 트랜잭션이 읽기 전용일 경우에 사용가능하다. 일반적으로 트
랜잭션 내에서 SELECT 쿼리만을 실행하는 경우에 이 속성을 사용한다.
Rollback 규칙 : Spring 프레임워크 트랜잭션의 디폴트 설정은 RuntimeException이 발생할 경
우에는 Rollback, CheckedException이 발생하는 경우에는 Commit되도록 하고 있다. 그러나
트랜잭션의 속성을 지정할 때 Rollback 규칙을 이용하여 디폴트 설정을 변경하는 것이 가능하다.
[그림 5-2]의 Rollback 규칙에서 마이너스(-)로 시작하는 Exception에 대해서는 무조건
Rollback, 플러스(+)로 시작하는 Exception은 무조건 Commit되도록 규칙을 변경할 수 있다.
Spring Framework – Transaction
PROPAGATION_REQUIRED, readOnly, timeout_0180, -ApplicationException
Spring Framework – Transaction
XML 파일의 천국
참고문서!!
• 자바로 구현하는 트렌젝션 프로그래밍 : http://www.j2eestudy.co.kr/
• Spring에서 트랜잭션 일시 중지 구현 : http://dev2dev.co.kr/pub/a/2005/07/spring_transactions.jsp
• J2EE Without the Application Server : http://www.onjava.com/lpt/a/6469
• Wire Hibernate Transactions in Spring : http://www.onjava.com/lpt/a/5854
• MSSQL Transaction : http://www.mssql.org/lecture/01_sql7/lock_06.asp
과제
과제
• POI API를 이용하여 Excel 파일을 읽는 API를 추상화하여 사용하기
편하도록 구현하라. Template Method 패턴과 Callback Interface를
이용하라.