Cute Apple
본문 바로가기
개발/jsp

jsp Singleton(DAO / Connection Pool)

by 미댕댕 2021. 6. 17.

DAO란❓

- 로직 중 오직 CRUD 수행만을 목적으로 정의된 객체 
- 사용이유 : 재사용성을 위한 CRUD코드의 분리가 목적

Connection Pool 이란❓

- 요청이 없더라도 데이터베이스와의 연결객체를 미리 다수 확보하여 관리하는 기법 

- 사용이유 : 웹은 요청 후 응답을 받는 시점에는 접속유지가 불가능하여 ,이때 이 요청에 의해 생성된 Connection도 닫아야 하므로, 접속자가 많을때는 접속객체 생성 소멸이 너무 빈번하게 발생

- 사용법 : 클라이언트의 요청이 있을때 접속객체를 생성하는 게 아니라, 미리 다수 확보된 커넥션 중 하나를 클라이언트에게 할당하고, 요청이 끝날때 다시 커넥션풀로 돌려보냄

 

Singleton 이란❓

- 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴

- 사용이유 : 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다. 또한 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.

 


Singleton 을 이용한 Connection 사용

 

<PoolManager.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package site0616.model.pool;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
 
//커넥션을 모아놓고 관리하는 커넥션풀 객체는 메모리에 인스턴스를 오직 1개만 두고 사용하기위해
//싱글턴으로 처리해보자(SingleTon)
public class PoolManager {
    InitialContext context;
    DataSource ds;
    private static PoolManager instance;
    
    private PoolManager() {
        try {
            context=new InitialContext();
            ds=(DataSource)context.lookup("java:comp/env/jndi/oracle");//JNDI로 자원을 검색하여 객체반환
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
    
    
    //생성자를 아무도 못쓰게 막아놓았으므로, 외부의 클래스들이
    //PoolManager의 인스턴스를 반환받아갈 수 있도록 책임을 지자
    public static PoolManager getInstance() {
        if(instance==null) {
            instance=new PoolManager();
        }
        return instance;
    }
 
    //누구든지 쿼리문을 수행하기 위해 Connection이 필요하다면 아래의 메서드를 호출하여 Connection을 가져가기만 하면됨
    public Connection getConnection() {
        Connection con=null;
        try {
            con=ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }
    
    //Connection 반납
    public void release(Connection con) {
        if(con!=null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    //Connection, PreparedStatement 반납
    public void release(Connection con, PreparedStatement pstmt) {
        if(pstmt!=null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(con!=null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    //Connection, PreparedStatement , ResultSet반납
    public void release(Connection con, PreparedStatement pstmt, ResultSet rs) {
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(pstmt!=null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(con!=null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
}
 
cs

 

<DAO.java>

- dao 에서 커넥션을 사용시 아래와 같이 인스턴스와 커넥션을 가져와서 사용한다.

반응형

'개발 > jsp' 카테고리의 다른 글

jsp Google Map api 사용  (0) 2021.06.28
jsp javaBean  (0) 2021.06.28
jsp 댓글 게시판(MyBatis / Ajax / Maven / Lombok) & 세션관리  (0) 2021.06.25
jsp 파일업로드 (oreilly / apache)  (0) 2021.06.23
jsp Servlet / Tomcat / JNDI  (0) 2021.06.17

댓글