Java 데이터베이스 연결 풀 상세 정보 및 간단한 사례
데이터베이스 연결 풀의 원리는 다음과 같다.
연결 탱크의 기본적인 사상은 시스템이 초기화될 때 데이터베이스 연결을 대상으로 메모리에 저장하는 것이다. 사용자가 데이터베이스에 접근해야 할 때 새로운 연결을 구축하는 것이 아니라 연결 탱크에서 이미 만들어진 빈 연결 대상을 꺼내는 것이다.사용이 끝난 후에도 사용자는 연결을 닫는 것이 아니라 다음 요청에 접근할 수 있도록 연결을 연결 풀에 되돌려 놓는다.연결의 구축, 끊기는 모두 연결 탱크 자체가 관리한다.또한 연결 풀의 매개 변수를 설정하여 연결 풀의 초기 연결 수, 연결의 상하한 수, 연결당 최대 사용 횟수, 최대 유휴 시간 등을 제어할 수 있다.자체 관리 메커니즘을 통해 데이터베이스 연결의 수량, 사용 상황 등을 감시할 수 있다.
자주 사용하는 데이터베이스 연결 풀:
자주 사용하는 데이터베이스 연결 탱크는 JNDI, C3p0, Apache의 Jakarta와 DBCPBoneCP가 있는데 그 중에서sping 프레임워크가 의존하는 제3자는 c3p0과dbcp 두 가지 방식을 사용했다.bonecp는 속도가 가장 빠른 데이터베이스 연결 탱크라고 불린다.JNDI 방식으로 생성된 데이터소스는 javax를 실현했습니다.sql.데이터소스(다른 세 가지 방식은 모두 아니다)
현재 우리는 주로 JNDI 방식을 어떻게 사용하는지 소개하는데 이런 방식은 웹 서버(예를 들어tomcat, weblogic, websphere,tomcat)에서java를 실현했다.sql.datasource.웹 서버에서 데이터 원본을 초기화하고connection을 만들고,분배,connection을 관리합니다.자체가 웹 서버에서 이루어진 기능이기 때문에 프로젝트에 특별한jar 패키지를 도입할 필요는 없지만 서버의 일부 프로필에 관련 설정을 추가해야 합니다.다음은 Tomcat 서버(데이터베이스는 MySQL)를 예로 들어 이러한 방식의 사용을 설명합니다.
데이터베이스 생성 및 데이터 초기화:
create table test(id INT PRIMARY KEY,name VARCHAR(10),price FLOAT)
INSERT INTO test VALUES(1,'English',22.2);
INSERT INTO test VALUES(2,'Math',78.9);
INSERT INTO test VALUES(3,'History',77.9);
1. 데이터를 mysql-connector-java-5.0.3-bin으로 구동합니다.jar를tomcat 디렉터리의lib에 넣기2.tomcat의 conf 아래의 context를 수정합니다.xml 파일, Resource 구성 지원 추가
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="100" maxIdle="30" maxWait="10000"
name="jdbc/ewsdb" username="root" password="admin" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/test1"
/>
1) name: Resource의 JNDI 이름을 지정합니다.
2) auth: Resource를 관리하는 관리자를 지정합니다. 두 가지 옵션이 있습니다: Container와 Application.Container는 용기에서 Resource를 만들고 관리하는 것을 표시하고, 응용 프로그램은 웹 응용 프로그램에서 Resource를 만들고 관리하는 것을 표시합니다.
3) type: Resource의 Java 클래스 이름을 지정합니다.
4) username: 데이터베이스에 연결할 사용자 이름을 지정합니다.
5) password: 데이터베이스에 연결하는 구령을 지정합니다.
6)driverClassName: 데이터베이스에 연결된 JDBC 드라이브의 Driver 구현 클래스의 이름을 지정합니다.
7) url: 데이터베이스에 연결할 URL을 지정합니다. 127.0.1은 연결할 데이터베이스 서버의 IP이고 3306은 데이터베이스 서버 포트이며 BookDB는 데이터베이스 이름입니다.
8)maxActive: 데이터베이스 연결 풀에서 활성 상태인 데이터베이스 연결의 최대 수를 지정합니다. 값을 0으로 하면 제한을 받지 않습니다.
9)maxIdle: 데이터베이스 연결 탱크에서 비어 있는 데이터베이스 연결의 최대 수를 지정합니다. 값을 0으로 하면 제한을 받지 않습니다.
10)maxWait: 데이터베이스 연결 탱크의 데이터베이스 연결이 비어 있는 최대 시간(밀리초 단위)을 지정합니다. 이 시간을 초과하면 이상이 발생합니다.수치는 -1로 제한없이 기다릴 수 있음을 나타낸다.
maxActive="100"
병렬 상황에서 최대 연결 탱크에서 얻을 수 있는 연결 수를 나타냅니다.만약에 데이터베이스가 단독이 아니라면 하나의 응용 프로그램에 사용할 수 있도록 maxActive 파라미터를 설정함으로써 특정한 응용 프로그램이 무제한으로 연결을 얻는 것이 다른 응용 프로그램에 영향을 미치는 것을 피할 수 있다. 만약에 데이터베이스가 하나의 응용 프로그램을 지원하는 데 사용된다면maxActive 이론적으로 이 데이터베이스가 지탱할 수 있는 최대 연결 수로 설정할 수 있다.maxActive는 연결 탱크를 통해 동시에 얻을 수 있는 최대 연결 수를 나타냅니다.연결의 획득과 방출은 양방향이다. 응용 프로그램이 연결 탱크를 요청할 때 연결 탱크는 데이터베이스에서 연결을 받아야 한다. 그러나 응용 프로그램이 연결을 사용하고 연결을 연결 탱크에 돌려줄 때 연결 탱크도 연결을 데이터베이스에 돌려줄까?분명히 답은 부정적이다. 그렇다면 연결 탱크가 많아져 성능을 높일 수 없을 뿐만 아니라 오히려 성능을 떨어뜨릴 수 있다. 그러나 연결 반환으로 응용한 후 연결 탱크는 어떻게 처리할까?
maxIdle="30"
병발 시 maxActive=100에 도달하면 연결 탱크는 데이터베이스에서 100개의 연결을 가져와 공급용 프로그램으로 사용해야 합니다. 프로그램이 연결을 닫은 후maxIdle=30이기 때문에 모든 연결이 데이터베이스에 반환되는 것은 아닙니다. 30개의 연결이 연결 탱크 종류에 유지되고 상태가 비어 있습니다.
minIdle=”2”
최소 기본값은 적용되지 않습니다. 연결 탱크의 연결이minIdle이 적으면 시스템 모니터링 라인이 보충 기능을 시작하고 일반적인 상황에서 보충 라인을 시작하지 않습니다.
질문: maxActive 및 maxIdle은 어떻게 설정합니까?
이론적으로 말하자면maxActive는 응용의 최대 병발수로 설정해야 한다. 그러면 최대 병발 상황에서도 응용은 연결 탱크에서 연결을 얻을 수 있지만 어려울 때 우리는 최대 병발수를 정확하게 예측하기 어렵다. 최대 병발수로 설정하는 것은 가장 좋은 서비스 품질 보증이다.
maxIdle에 대응하는 연결은 실제적으로 연결 탱크가 유지하는 긴 연결이다. 이것도 연결 탱크가 장점을 발휘하는 부분이다. 이론적으로 말하자면 비교적 많은 긴 연결을 유지하면 요청을 응용할 때 더욱 빨리 응답할 수 있지만 너무 많은 연결을 유지하면 데이터베이스에 대량의 자원을 소모할 수 있기 때문에 maxIdle도 크면 클수록 좋은 것이 아니다. 예를 들어 우리는 maxIdle를 50-100에서 50에 가까운 숫자로 설정하는 것을 권장한다. 예를 들어 55.이렇게 하면 최대 병발을 동시에 고려하고 비교적 적은 데이터베이스 연결을 유지할 수 있으며 대부분의 경우 응용 프로그램에 가장 빠른 상응하는 속도를 제공할 수 있다.
3. 응용 프로그램의 웹을 엽니다.xml 파일, 다음 설정 추가
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/ewsdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
1) description: 인용된 자원에 대한 설명.
2) res-ref-name: 인용된 자원의 JNDI 이름을 지정하고
3)res-type: 인용된 자원의 클래스 이름을 지정하고
4)res-auth: 인용된 자원을 관리하는 관리자를 지정합니다.
4. 자바 코드를 작성하여tomcat 환경에서 사용한다. 다음과 같다.
JSP 범례 만들기: MyJsp.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<html>
<head>
<title>Tomcat JNDI </title>
</head>
<body>
<%
try{
Connection conn;
Statement stmt;
ResultSet rs;
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/ewsdb");
conn = ds.getConnection();
stmt = conn.createStatement();
//
rs = stmt.executeQuery("select ID,NAME,PRICE from test");
//
out.println("<table border=1 width=400>");
while (rs.next()){
String col1 = rs.getString(1);
String col2 = rs.getString(2);
float col3 = rs.getFloat(3);
//
out.println("<tr><td>"+col1+"</td><td>"+col2+"</td><td>"+col3+"</td></tr>");}
out.println("</table>");
// 、SQL
rs.close();
stmt.close();
conn.close();
}catch(Exception e){
out.println(e.getMessage());
e.printStackTrace();
}
%>
</body>
</html>
브라우저에서 가져오기http://localhost:8080/test/MyJsp.jsp, 결과 보기읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.