。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-65일차(7월26일)] - 웹프로그래밍 46일차

quarrrter 2023. 7. 26. 15:40

common - requesteneity 삭제 

 

51 - DB커넥션 풀을 이용한 connection 재사용하기 

 

클라이언트앱에서 드라이버.커넥션어쩌구 하면 클라이언트와 연결된 스레드가 만들어지고 스레드가 insert등 테이블 변경 작업을 요청받아 처리 후 임시 DB에 보관되고 commit/rollback 하면 table에 적용.

1. Connection 당 thread 할당

2. thread 별로 임시 DB 사용 

3. thread 별로 commit / rollback 이 이루어짐 

4. 클라이언트 별 독립된 작업을 수행 = 클라이언트 간 작업의 간섭이 없음.

 

 

스레드 3개 중 머가 먼저 실행될지 모름. 스레드 경쟁

1 , 2 번 하고 3번 임시 디비 저장되는데 3번이 갑자기 commit 해버리면 임시 db에 잇는 모든게 실제 터미널에 적용됨 

근데 1의 첨부파일이 너무 커서 insert 실패 해서 roll back 하려는데 이미 commit 을 해서 client 1,2의 작업을 rollback 할수 없다.

 

client 3개가 하나의 connection을 공유하고 있기때문에 dbms입장에서는 client 1,2,3을 하나의 클라이언트로 인식. 

=> 스레드 별로(클라이언트 별로) 다른 커넥션을 쓰게 만들어야함.

 

 

 

*DataSource의 역할 

server - util - DataSource class 생성 (connectionBox : 스레드에 값을 넣고 꺼내는 일을 할 객체 만듬 )

 

 

*auto commit을 false 로 설정해야하는 이유? 

=> 실무에서는 데이터 입력,변경,삭제 작업을 수행할 때 여러개의 테이블을 사용한다. 

=> 학습용 예제는 한 개의 데이터를 한 개의 테이블에 저장하지만 실무에서는 많은 항목을 다뤄야하기 때문에 데이터가 중복되지 않도록 여러 테이블에 분산 저장한다. 

옛날자바32비트 시절에 ,,, long값 저장할때 (8바이트) 기본인 4바이트씩 저장하는데 스레드 싸움에서 져서 어중간하게 저장되는 경우도 잇엇음 그래서 atomic 설정해서 한단위로 계산하게 만듬 .. 

 

트랜젝션: 한 단위로 묶어서 다루는 작업들

모든 데이터 변경 작업이 성공했을 때 테이블에 적용. <= commit

한 개의 작업이라도 실패하면 그 전까지 수행했던 작업들 모두 취소,저장 안 됨 <= rollback

 

 

트랜잭션(transaction)

=> 여러 작업을 한 단위로 다루기 위해 묶어 놓은 것

   -> 트랜잭션하기위해 auto commit을 false로 설정해야한다. 

 

false 상태: 데이터 변경 작업이 커넥션 별로 임시DB에 보관된다. 

true면 임시db 저장 안되고 작업 즉시즉시 ok 뜬건 바로바로 저장됨. 

작업1 -ok commit 작업1 -ok rollback
작업2 -ok 작업2 -ok
작업3 -ok 작업3 -ok
작업4 -ok 작업4 -fail
적용 - commit 취소 - rollback

 

*commit/ rollback 실행 지점? 

-> connection 개체안에 commit/ rollback 있음.

DAO를 사용(호출)하는 에서 commit/rollback을 수행해야한다. (DAO가 아님, DAO에서 하면 임시DB가 아닐 실제 테이블에 적용되는 거임 )

 

커넥션 하나 쓰면 클라이언트 2개 시켰을때 하나 오류 뜨면 다른 클라이언트 작업수행하는 것들도 오류 떠버림 ; 

 

 

그래서,,, Datasource: 명령어를 실행하는 시점에 스레드가 갖고 있는 스레들 꺼내서 dao에 전해줌

DAO와 DataSource

mysqlboarddao , member에

DataSource DS 추가하기  -- con을 ds.getConnection() 로 수정 

Server의 커넥션 부분도 전체 수정 

Listener들 수정 

 

클라이언트 2개 실행하면 ..

이제 커넥션 나눠져서 클라이언트별 개별 작업수행. 

A클라이언트 작업에 오류떠도 b 클라이언트의 작업엔 상관없음. 

 

dbms는 커넥션마다 커밋, 롤백( 트랜젝션)을 관리한다. 

다른 스레드가 그 커넥션을 가지고 작업하면 커넥션 꼬여벌임. 개별 자료로하는게 조음

 

사용했었던 커넥션을 그대로 꺼내서 쓰게 되면 인증, 권한 검증시간이 줄어듬 ->  커넥션 가비지 안 생기고, 스레드 & 커넥션 생성시간 안듬. , 메모리 절약, 속도 빠름, 

서버프로그램은 기본적으로 다 스레드풀, 커넥션풀 (재활용하는) 시스템임 

 

datasource 만나면 얘가 바로 커넥션 풀이군아 ~~~  커넥션 재활용하는구나~