* 51. DB ConnectionPool 사용 (DBMS 직접 사용 - AutoCommit = False)
*커넥션 = 스레드
*스레드 = 임시DB
*스레드 = Commit/rollback
*Client 별로 독립적인 작업을 수행 (Client 간의 작업 간섭 발생 X)
AutoCommit 을 False 로 한다면,
delete, insert 등 작업결과를 임시DB에 보관한다.
① commit을 하면
임시 보관된 작업 결과를 실제 테이블에 적용하여 DBMS에 반영한다.
② 또는 rollback을 하면
임시DB에 보관된 작업 결과를 삭제한다.
* 51. DB ConnectionPool 사용 (현황)
문제점 ?
DBMS에서 같은 쓰레드를 공유하여 Client가 사용할 때.
Client에서는 고객이 Application Server에 각각 다른 명령을 보낼 수 있다.
쓰레드가 나누어져 있기 때문이다.
그러나 결국에는 같은 ActionListener를 사용하며 Dao 객체들은
하나의 Connection으로 연결되기 때문에 DBMS Table과 연결된
1개의 쓰레드를 공유하여 사용하기 때문에, 임시 DB가 하나의 클라이언트에 의해
Commit 된다면 다른 작업 중인 클라이언트가 작업 중인 내용을 rollback 할 수 없게 된다.
(Client1 : 회원삭제 후 -> Commit)
(Client2 : 회원추가 후 -> rollback) x 실패하게된다.
해결방법 ?
커넥션 별로 DBMS에서 다른 쓰레드를 사용하게 해야한다.
ConnectionPooling 사용
* 51. DB ConnectionPool 사용 (스레드별로 Connection 구분해서 사용)
DataSource는 미리 생성된 커넥션들 중에서 하나를 할당하여 Dao 객체에게 반환한다.
즉, 스레드별로 각각의 Connection을 구분해서 사용한다.
* 51. DataSource 의 역할
DataSource는 요청이 들어올 때마다 미리 생성된 커넥션 중에서 하나를 제공하여
Dao 객체가 해당 Connection을 사용할 수 있도록 돕는 역할을 한다.
* Auto Commit을 False 로 설정해야하는 이유 ?
데이터가 중복되지 않도록 여러 테이블에 분산 저장해야한다.
이때 게시글을 작성하는 과정에서 첨부파일 저장이 실패한다면
게시글 입력을 취소해야한다.
↑ "게시글 저장"을 수행할 때 이루어지는 모든 데이터 변경 작업들은
한 단위(atomic)(transaction)로 이루어져야 한다.
즉, 데이터의 무결성과 원자성을 보장하고 여러 데이터 변경 작업들을 하나의 트랜잭션으로 묶기 위해
Auto Commit을 False로 설정하는 것이다.
트랜잭션 ?
여러 작업을 한 단위로 다루기 위해 묶어 놓은 것
ex)
배송 트랜잭션 완료란 ?
집하 - 전달 - 도착 모든 과정이 끝난 상태.