[JSP study] 커넥션 풀

Noah97·2022년 5월 25일
0

JspStudy

목록 보기
11/18
post-thumbnail

1. 커넥션 풀의 개요

 커넥션 풀을 사용하면 풀 속에 미리 커넥션이 생성되어있기 때문에 커넥션을 생성하는데 드는 연결 시간이 소비되지 않는다. 또한 현재 다른 사용자가 사용하지 않는 커넥션을 재사용이 가능하기 때문에 사용자가 접속할 때마다 계속해서 커넥션을 생성할 필요가 없다. 즉, 커넥션 풀을 사용한다면 프로그램 효율과 성능이 전체적으로 증가하게 된다.
CP(Connection Pool)사용 흐름 ⬇️

CP를 사용하는 것은 데이터베이스 관련 애플리케이션을 개발할 때는 필수적이다. 애플리케이션에서 CP(Connection Pool)를 사용하지 않으면 메모리에 너무 큰 부담이 발생하므로 서버는 얼마 버티지 못하고 서비스가 중지된다.

2. JNDI의 개요

 JNDI(Java Naming and Directory Interface)란 명명 서비스 및 디렉토리 서비스에 접근하기 위한 API를 말한다. 즉 특정 자원에 접근하기 위한 이름으로 사용된다.

3. 톰캣에서 제공되는 CP를 위한 DBCP API를 사용하여 데이터 베이스 사용하기

context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource
	name = "jdbc/mariaDB"
	auth = "Container"
	type = "javax.sql.DataSource"
	factory = "org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
	driverClassName = "org.mariadb.jdbc.Driver"
	url = "jdbc:mysql://localhost:3306/testdb3"
	username = "java"
	password = "java"
	maxActive = "100"
	maxIdle = "30"
	maxWait = "10000"
	removeAbandoned = "true"
	removeAbandonedTimeout = "60" />
</Context>

<!-- 
1. name = JNDI로 호출될 이름을 설정
2. auth : DBCP를 관리할 관리자 
3. type : 해당 resource의 return type
4. factory : dbcp 관리 클래스
5. driverClassName : JDBC를 이용하기 위한 드라이버 클래스
6. url : DB의 접속 URL
7. username : DB의 계정 명
8. password : 계정에 대한 비밀번호
9. maxActive : 최대 접속 허용 개수
10. maxIdle : DB pool에 여분으로 남겨질 최대 Connectin 개수
11. maxWait : DB 연결이 반환되는 Timeout의 최대 시간(-1은 무한 대기)
12. removeAbandoned : Connection이 잘못 관리되어 버려진 연결을 찾아 재활용할 것인지 여부 설정
13. removeAbandonedTimeout : 버려진 연결로 인식할 기본 시간 설정
(초 단위로 해당 시간이 지나면 버려진 연결로 인식)
 -->

dbcpAPITest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "javax.sql.*" %>
<%@ page import = "javax.naming.*" %>
<%
	Connection conn = null;
	try {
		Context context = new InitialContext();
		DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/mariaDB");
		conn = ds.getConnection();
		out.println("maridaDB연결 성공");
	} catch(SQLException e) {
		out.println("mariaDB연결 실패");
		e.printStackTrace();
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

연결 되었을 시 화면

4. 트랜잭션

 트랜잭션이란 일 처리의 최소 단위를 의미한다. 트랜잭션은 데이터베이스 처리를 모두 일관되게 하기 위해 존재한다. 만약 데이터베이스에 두 가지 명령을 주었을 때 첫 번째 명령의 처리는 올바르게 되었지만 두 번째 명령의 처리가 올바르지 못한다면 이것은 일관되지 않은 것이다. 두 가지 명령 중 하나라도 실패하면 원점으로 되돌릴 수 있어야 하며, 이러한 개념을 가진 것이 트랜잭션이다.
트랜잭션의 기본 흐름도 ⬇️

5. JDBC 활용

statementTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%
	Connection conn = null;
	String sql = "insert into student(num, name) value(7,'야옹이')";
	Statement stmt = null;
	
	try {
		Context context = new InitialContext();
		DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/mariaDB");
		conn = ds.getConnection();
		stmt = conn.createStatement();
		
		int result = stmt.executeUpdate(sql);
		if(result != 0) {
			out.println("레코드가 등록됐다");
		}
	} catch(Exception e) {
		out.println("레코드가 등록 실패하였다.");
		e.printStackTrace();
	}
	finally {
		try {
			stmt.close();
			conn.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

preparedStatementTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%
	Connection conn = null;
	String sql = "insert into student(num, name) value(?,'야옹이')";
	PreparedStatement pstmt = null;
	
	try {
		Context context = new InitialContext();
		DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/mariaDB");
		conn = ds.getConnection();
		pstmt = conn.prepareStatement(sql);
		
		for(int i = 8; i <= 11; i++) {
			pstmt.setInt(1, i);
			if(pstmt.executeUpdate() != 0) {
				out.println(i+" 번 레코드를 등록하였습니다");
			}
		}
	} catch(Exception e) {
		out.println("레코드 등록에 실패하였습니다.");
		e.printStackTrace();
	}
	finally {
		try {
			pstmt.close();
			conn.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>
profile
안녕하세요 반갑습니다😊

0개의 댓글