본문 바로가기

Application/JSP Server

[JSP] 8. 데이터베이스 커넥션 풀과 트랜잭션

반응형

1. 커넥션

:애플리케이션과 데이터베이스의 연결, 애플리케이션에서 데이터베이스에 접속하고 접속을 종료하는 일련의 과정

 

2. 트랜잭션

: 여러 작업을 하나의 단위로 처리하는 것

 

3. 데이터베이스 커넥션 풀

: 미리 일정한 수의 커넥션을 만들어 놓고 필요한 시점에 애플리케이션에 제공하는 서비스 및 관리 체계

 

(1) WAS가 시작될 때 일정 수의 커넥션을 미리 생성

(2) 웹 애플리케이션 요청에 따라 생성된 커넥션 객체를 전달 [JNDI 이용]

(3) 일정 수 이상의 커넥션이 사용되면 새로운 커넥션 생성

(4) 사용하지 않는 커넥션은 종료하고 최소한의 기본 커넥션을 유지

 

  • 커넥션 풀 구현 유형
    • 직접 구현
    • 아파치 자카르타 DBCP API를 이용한 구현
    • 애플리케이션 서버 제공
    • 프레임워크 제공

 

  • DBCP API를 이용한 커넥션 풀 구현
    1. DBCP API 설치
      • 톰캣 7.0부터 DBCP 내장
    2. 톰캣에 DataSoure 설정
      1. server.xml 이나 context.xml에서 설정
      2. DB연결을 위한 정보와 커넥션풀 운영 관련 정보로 구성

context.xml 파일 수정 [따옴표 바꿀것]

<Resource name=“jdbc/mysql” auth=“Container”
 type="javax.sql.DataSource"
 driverClassName=“com.mysql.jdbc.Driver”
 url=“jdbc:mysql://127.0.0.1/jspdb”
 username=“jspbook” password=“1234”
 maxActive=“5” maxIdle=“3” maxWait=“-1” />

 

<Resource> 태그 속성

username 계정 이름
password 계정 비밀번호
driverClassName JDBC 드라이버 클래스 이름
url 접속에 필요한 정보
maxActive 데이터베이스 최대 연결 개수
maxIdle 데이터베이스 최대 유휴 연결 개수

 

web.xml 설정 [자바 프로그램에서 네이밍서비스로 커넥션 풀에 접근할 수 있도록 JNDI 이름을 설정]

<resource-ref>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-auth>Container</res-auth>

</resource-ref>

 

4. 트랜잭션 처리

: 트랜잭션은 애플리케이션 서버 차원에서 관리가 이루어진다. [Java EE]

 

5. commit과 rollback

: 데이터베이스에서 트랜잭션 지원을 위해 제공하는 기능

 

  • commit
    • 데이터베이스에 트랜잭션이 완료되었음을 알리는 명령
    • commit이 완료되어야만 다른 커넥션에서도 변경된 데이터를 확인할 수 있다.
  • rollback
    • 트랜잭션을 취소하는 명령, 현재 연결에서 수행한 결과를 원래대로 되돌리는 역할
    • rollback을 이용해 모든 작업을 원래 상태로 되돌릴 수 있다.

6. JDBC에서 트랜잭션 처리

: auto commit 모드를 해제한 다음 프로그램에서 commit과 rollback 시기를 정해 처리

 

  • auto commit 해제
    • conn.setAutoCommit(false);
  • JSP에서 commit과 rollback
    • 클래스의 메서드로 제공
    • conn.commit();
      conn.rollback();
  • 일괄 갱신
    • Statement에서 일괄 갱신
      • conn.setAutoCommit(false);
        Statement stmt = conn.createStatement();
        stmt.addBatch("insert into table1 values(1,'test')");
        stmt.addBatch("update table2 set memo='test' ");
        int[] cnt = stmt.executeBatch();
    • PreparedStatement에서 일괄 갱신
      • PreparedStatement pstmt = conn.prepareStatement("update table1 set memo=? where num=?");
        pstmt.setString(1,"테스트1");
        pstmt.setString(2,"1");
        pstmt.addBatch();
        pstmt.setString(1,"테스트2");
        pstmt.setString(2,"2");
        pstmt.addBatch();
        int[] cnt = pstmt.executeBatch();
반응형