데이터베이스 연결 풀이 란?

Java에서 데이터베이스 액세스 기술은 다음 범주로 나눌 수 있습니다.

  • JDBC가 데이터베이스에 직접 액세스
  • JDO 기술
  • Hibernate, ibatis, mybatis 등과 같은 타사 O / R 도구

JDBC는 데이터베이스, JDO, Hibernate 등에 액세스하기위한 Java의 초석입니다 . JDBC를 더 잘 캡슐화합니다.
JDBC (Java Database Connectivity) 는 특정 데이터베이스 관리 시스템과 일반 SQL 데이터베이스 액세스 및 작업과 독립적 인 공용 인터페이스 (API 집합)로, 데이터베이스에 액세스하기 위한 표준 Java 클래스 라이브러리 (java.sql)를 정의합니다. , javax .sql)이 라이브러리를 사용하여 표준 방식으로 데이터베이스 리소스에 쉽게 액세스 할 수 있습니다. JDBC는 다양한 데이터베이스에 액세스 할 수있는 통합 된 방법 을 제공하여 개발자에게 몇 가지 세부적인 문제를 방지합니다. JDBC의 목표는 Java 프로그래머가 JDBC를 사용하여 JDBC 드라이버를 제공하는 모든 데이터베이스 시스템에 연결할 수 있도록하는 것이므로 프로그래머는 특정 데이터베이스 시스템의 특성에 대해 너무 많이 알 필요가 없으므로 개발 과정.
여기에 사진 설명 삽입
물론 통합 JDBC 인터페이스를 사용하지 않고도 다른 데이터베이스 공급 업체의 드라이버를 사용할 수 있지만 이는 Java의 이식성을 반영하지 않습니다.
JDBC는 데이터베이스 작업을 위해 Sun 회사에서 제공하는 인터페이스 집합입니다. Java 프로그래머는이 인터페이스 집합에 대해서만 프로그래밍하면됩니다. 서로 다른 데이터베이스 공급 업체는이 인터페이스 세트에 대해 서로 다른 구현을 제공해야합니다. 서로 다른 구현의 모음은 서로 다른 데이터베이스의 동인입니다. ----- 인터페이스 지향 프로그래밍

즉,
JDBC : 데이터베이스 작업을위한 인터페이스
JDBC 드라이버 세트 :이 인터페이스 세트에 대해 다른 구현이 제공되어야합니다. 서로 다른 구현 모음은 서로 다른 데이터베이스의 드라이버입니다. 예를 들어 mysql을 사용하려면 mysql 구동 jar 패키지가 필요합니다.

데이터베이스 연결 풀 c3p0, dhcp

데이터베이스 기반 웹 프로그램을 사용하고 개발할 때 기존 모드 (JDBC)는 기본적으로 다음 단계를 따릅니다.

  1. 기본 프로그램 (예 : 서블릿, Bean)에서 데이터베이스 연결 설정
  2. SQL 작업 수행
  3. 데이터베이스 연결 끊기

그러나이 개발 모드에는 문제가 있습니다
. DriverManager를 사용하여 일반적인 JDBC 데이터베이스 연결을 얻습니다. 데이터베이스에 연결할 때마다 Connection을 메모리에로드 한 다음 사용자 이름과 암호를 확인해야합니다. 0.05 초 ~ 1 초 소요). 데이터베이스 연결이 필요한 경우 데이터베이스에서 하나를 요청하고 실행이 완료된 후 연결이 끊어집니다. 이렇게하면 많은 리소스와 시간이 소비됩니다. 데이터베이스 연결 리소스는 잘 재사용되지 않았습니다. 수백 또는 수천 명의 사용자가 동시에 온라인 상태 인 경우 빈번한 데이터베이스 연결 작업은 많은 시스템 리소스를 차지하고 서버 충돌을 일으킬 수도 있습니다.
각 데이터베이스 연결에 대해 사용 후 연결을 끊어야합니다. 그렇지 않으면 프로그램이 비정상으로 종료되지 않으면 데이터베이스 시스템에서 메모리 누수가 발생하여 결국 데이터베이스가 다시 시작됩니다.
이런 종류의 개발은 생성되는 연결 객체의 수를 제어 할 수없고, 시스템 자원이 고려없이 할당되며, 너무 많은 연결이있을 경우 메모리 누수 및 서버 크래시의 원인이 될 수 있습니다.
기존 개발의 데이터베이스 연결 문제를 해결하기 위해 데이터베이스 연결 풀 기술을 사용할 수 있습니다.
데이터베이스 연결 풀의 기본 개념은 데이터베이스 연결을위한 "버퍼 풀"을 설정하는 것입니다. 미리 버퍼 풀에 일정 수의 연결을 설정하고 데이터베이스 연결을 설정해야하는 경우 "버퍼 풀"에서 하나만 꺼내 사용 후 다시 넣으면됩니다.
데이터베이스 연결 풀은 데이터베이스 연결을 할당, 관리 및 해제하는 역할을하며 응용 프로그램이 기존 데이터베이스 연결을 다시 설정하는 대신 재사용 할 수 있도록합니다.
데이터베이스 연결 풀이 초기화되면 일정 수의 데이터베이스 연결이 생성되어 연결 풀에 배치됩니다. 이러한 데이터베이스 연결 수는 최소 데이터베이스 연결 수로 설정됩니다. 이러한 데이터베이스 연결의 사용 여부에 관계없이 연결 풀은 항상 최소한이 수의 연결이 있는지 확인합니다. 접속 풀의 최대 데이터베이스 접속 수는이 접속 풀이 차지할 수있는 최대 접속 수를 제한합니다. 접속 풀에서 응용 프로그램이 요청한 접속 수가 최대 접속 수를 초과하면 이러한 요청이 대기 대기열.

JDBC의 데이터베이스 연결 풀은 javax.sql.DataSource로 표시됩니다. DataSource는 단순한 인터페이스입니다. 인터페이스는 일반적으로 서버 (Weblogic, WebSphere, Tomcat)에 의해 구현됩니다. 구현을 제공하는 일부 오픈 소스 조직도 있습니다.

  • DBCP 데이터베이스 연결 풀
  • C3P0 데이터베이스 연결 풀

DataSource는 일반적으로 연결 풀과 연결 풀 관리의 두 부분을 포함하는 데이터 소스라고합니다. DataSource를 연결 풀로 호출하는 것이 일반적입니다.
DataSource는 DriverManager를 대체하여 Connection을 가져 오는 데 사용되므로 빠르고 데이터베이스 액세스를 크게 향상시킬 수 있습니다. 속도.
DHCP 데이터 소스

DBCP는 Apache Software Foundation의 오픈 소스 접속 풀 구현입니다.이 접속 풀은이 조직의 다른 오픈 소스 시스템 인 Common-pool에 의존합니다.이 접속 풀 구현을 사용하려면 다음 두 개의 jar 파일을 다음에 추가해야합니다. 시스템 :
Commons -dbcp.jar : 연결 풀의 실현
Commons-pool.jar : 연결 풀에
의해 실현 종속 라이브러리 Tomcat 의 연결 풀이이 연결 풀에 의해 실현됩니다. 데이터베이스 연결 풀은 애플리케이션 서버와 결합하여 사용하거나 애플리케이션에서 독립적으로 사용할 수 있습니다.

데이터 소스는 데이터베이스 연결과 다릅니다. 여러 데이터 소스를 생성 할 필요가 없습니다. 데이터베이스 연결을 생성하는 팩토리이므로 전체 응용 프로그램에는 하나의 데이터 소스 만 필요합니다.
데이터베이스 액세스가 끝나면 프로그램은 여전히 ​​이전과 같이 데이터베이스 연결을 닫습니다. conn.close (); 그러나 위 코드는 데이터베이스에 대한 물리적 연결을 닫지 않고 데이터베이스 연결을 해제하고 데이터베이스 연결로 반환합니다. 풀.

두 연결 풀에 대한 데이터베이스 연결을 만드는 방법에는 두 가지가 있습니다.

public class DataSourceTest {
    
    
	
	//使用 C3P0 方式二:
	@Test
	public void test4() throws SQLException{
    
    
		DataSource ds = new ComboPooledDataSource("helloc3p0");
		
		Connection conn = ds.getConnection();
		
		System.out.println(conn);
	}
	
	//使用 C3P0 方式一:
	@Test
	public void test3() throws Exception{
    
    
		ComboPooledDataSource cpds = new ComboPooledDataSource();
		cpds.setDriverClass("com.mysql.jdbc.Driver");
		cpds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");
		cpds.setUser("root");
		cpds.setPassword("123456");
	 
		Connection conn = cpds.getConnection();
		
		System.out.println(conn);
	}
	
	//使用 DBCP 方式二:
	@Test
	public void test2() throws Exception{
    
    
		Properties pros = new Properties();
		pros.load(DataSourceTest.class.getClassLoader().getResourceAsStream("dbcp.properties"));
		
		DataSource ds = BasicDataSourceFactory.createDataSource(pros);
		
		Connection conn = ds.getConnection();
		
		System.out.println(conn);
	}
	
	//使用 DBCP 方式一:
	@Test
	public void test1() throws SQLException{
    
    
		BasicDataSource bds = new BasicDataSource();
		bds.setDriverClassName("com.mysql.jdbc.Driver");
		bds.setUrl("jdbc:mysql://127.0.0.1:3306/test");
		bds.setUsername("root");
		bds.setPassword("123456");
		
		bds.setInitialSize(10);
		bds.setMaxActive(10);
		
		Connection conn = bds.getConnection();
		
		System.out.println(conn);
		
		//将连接放回到连接池中
		conn.close();
	}
 
}

두 번째 c3p0을 사용하려면 구성 파일이 필요하고 (물론 속성 파일도 사용할 수 있음) 구성 파일의 이름은 c3p0-config.xml이어야합니다. 데이터베이스 제조업체의 맨 아래 계층은 키를 기반으로 데이터를 캡슐화하기 때문입니다. 따라서이 키를 기반으로하기 때문에 일치하는 읽기를 수행하려면 읽기가 클래스 로더를 통해 수행되기 때문에 src 경로 아래에 있어야합니다. 두 번째 방법에서 dhcp를 사용하려면 jdbc의 속성 파일과 거의 동일한 속성 파일이 필요하므로 반복하지 않겠습니다.

c3p0-config.xml

<c3p0-config>
  <named-config name="helloc3p0"> 
  
  	<!-- 连接数据库的四个字符串 -->
  	<property name="driverClass">com.mysql.jdbc.Driver</property>
  	<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property>
  	<property name="user">root</property>
  	<property name="password">123456</property>
  
  	<!-- 若连接池满了一次增长几个 -->
    <property name="acquireIncrement">5</property>
    
    <!-- 连接池初始大小 -->
    <property name="initialPoolSize">10</property>
    
    <!-- 连接池中最小连接数 -->
    <property name="minPoolSize">5</property>
    
    <!-- 连接池中最大连接数 -->
    <property name="maxPoolSize">10</property>
 
	<!-- 整个连接池中最多管理的 Statement 的个数 -->
    <property name="maxStatements">10</property> 
    
    <!-- 连接池中每个连接最多管理的 Statement 的个数 -->
    <property name="maxStatementsPerConnection">2</property>
 
  </named-config>
</c3p0-config>

참고 : 구성 파일의 이름은 DataSource에서 전달되는 매개 변수와 일치해야합니다. ds = new ComboPooledDataSource ( "helloc3p0");

추천

출처blog.csdn.net/WA_MC/article/details/113526437