Java 데이터베이스 연결 풀에 대한 자세한 설명
데이터베이스 연결 풀의 원리는 다음과 같습니다.
연결 풀의 기본 아이디어는 데이터베이스 연결을 메모리에 객체로 저장하는 것입니다. 시스템 초기화 중에 사용자가 데이터베이스에 액세스해야 하는 경우 새 연결을 설정하는 대신 설정된 유휴 연결 개체를 연결 풀에서 가져옵니다. 사용 후 사용자는 연결을 닫지 않고 다음 요청을 위해 연결을 다시 연결 풀에 넣습니다. 연결 설정 및 연결 해제는 연결 풀 자체에서 관리됩니다. 동시에 연결 매개변수를 설정하여 연결 풀의 초기 연결 수, 연결의 상한 및 하한, 각 연결의 최대 사용 횟수, 최대 유휴 시간 등을 제어할 수도 있습니다. 수영장. 또한 자체 관리 메커니즘을 통해 데이터베이스 연결 수, 사용량 등을 모니터링할 수 있습니다.
일반적으로 사용되는 데이터베이스 연결 풀:
일반적으로 사용되는 데이터베이스 연결 풀에는 JNDI, C3p0, Apache의 Jakarta 및 DBCPBoneCP가 포함되며, 그 중 sping 프레임워크가 의존하는 타사에서는 c3p0 및 dbcp를 사용합니다. Bonecp는 가장 빠른 데이터베이스 연결 풀로 알려져 있습니다. JNDI 메소드로 생성된 데이터 소스는 실제로 javax.sql.datasource를 구현합니다(다른 세 가지 메소드는 그렇지 않습니다)
이제 JNDI 메소드 사용 방법을 주로 소개합니다. 이 메소드는 웹 서버(예: : tomcat, weblogic, websphere, tomcat), java.sql.datasource를 구현합니다. 웹 서버는 데이터 소스 초기화, 연결 생성, 연결 할당 및 관리를 담당합니다. 기능 자체는 웹 서버에서 구현되기 때문에 프로젝트에 특별한 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 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: JNDI 이름을 지정합니다. 자원.
2) auth: 리소스를 관리하는 관리자를 지정합니다. 컨테이너와 애플리케이션이라는 두 가지 선택 값이 있습니다. 컨테이너는 컨테이너에 의해 리소스가 생성되고 관리되는 것을 의미하고, 애플리케이션은 웹 애플리케이션에 의해 리소스가 생성 및 관리되는 것을 의미합니다.
3) 유형: Resource라는 Java 클래스 이름을 지정합니다.
4) 사용자 이름: 데이터베이스에 연결할 사용자 이름을 지정합니다.
5) 비밀번호: 데이터베이스에 접속하기 위한 비밀번호를 지정합니다.
6) DriverClassName: 데이터베이스에 연결하는 JDBC 드라이버의 Driver 구현 클래스 이름을 지정합니다.
7)url: 데이터베이스에 연결할 URL을 지정합니다. 127.0.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.打开应用程序的 Web.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:指定管理所引用资源的Manager,与
4. 编写使用java代码,并放在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,即可查看结果
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
更多Java 数据库连接池详解及简单实例相关文章请关注PHP中文网!