java: 데이터베이스 연결 풀

개념

예를 들어, 식당을 한다고 가정해 보면, 손님이 오면 웨이터를 고용해서 이용하고 해고하고, 다음 손님이 오면 또 다른 웨이터를 불러서 이용하고 해고한다.

이것이 JDBC를 사용하여 지금 데이터베이스에 연결하는 시나리오입니까? 매번 링크를 얻고 사용 후에 해제합니다.

하지만 이는 분명히 부적절합니다. 연결을 신청할 때마다 서버 최하위 계층에서 메모리를 신청해야 하기 때문입니다. 이는 매우 번거롭고 시간이 많이 소요되므로 다시 레스토랑의 예로 돌아가겠습니다. 여러 명의 웨이터가 봉사하러 왔습니다. 스레드 풀에 비유하면 다음과 같습니다.

데이터베이스 연결의 컨테이너(컬렉션)를 보유하는 풀이 있습니다. 시스템이 초기화된 후 컨테이너가 생성되고 컨테이너에 일부 연결 개체가 적용됩니다. 사용자가 데이터베이스에 액세스하면 컨테이너에서 연결 개체를 가져옵니다. 사용자가 데이터베이스에 액세스한 후 연결 개체는 수영장으로 돌아가야 합니다.
여기에 이미지 설명을 삽입하세요
이점:
1. 리소스 절약
2. 효율적인 사용자 액세스

성취하다

연결 풀은 java에서 정의한 몇 가지 규칙으로, 드라이버 공급자가 구현하는 javax.sql 아래에 인터페이스 DataSource(데이터 소스/연결 풀)가 있습니다.

DataSource 인터페이스는 두 가지 방법을 제공합니다.

  • 연결 가져오기: getConnection()
  • 연결을 반환합니다: Connection.close(). 연결 개체 Connection이 연결 풀에서 얻은 경우 Connection.close() 메서드를 호출하면 연결이 닫히지 않고 연결이 반환됩니다.

일반적으로 우리는 위의 방법을 구현하지 않지만 데이터베이스 공급업체에서 구현할 수 있습니다.

  1. C3P0: 데이터베이스 연결 풀 기술
  2. Druid: Alibaba에서 제공하는 데이터베이스 연결 풀 구현 기술

C3P0

  • 단계:
    1. jar 패키지 가져오기(2개) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar,

      • 데이터베이스 드라이버 jar 패키지를 가져오는 것을 잊지 마세요.
    2. 구성 파일을 정의합니다.

      • 이름: c3p0.properties 또는 c3p0-config.xml
      • 경로: 파일을 src 디렉터리에 직접 넣으세요.
    3. 핵심 객체 데이터베이스 연결 풀 객체 ComboPooledDataSource 생성

    4. 연결 가져오기: getConnection

  • 암호:
//1.创建数据库连接池对象
DataSource ds  = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();

예:
c3p0-config.xml

<c3p0-config>
  <!-- 使用默认的配置读取连接池对象 -->
  <default-config>
  	<!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db4</property>
    <property name="user">root</property>
    <property name="password">root</property>
    
    <!-- 连接池参数 -->
    <!--初始化申请的连接数量-->
    <property name="initialPoolSize">5</property>
    <!--最大的连接数量-->
    <property name="maxPoolSize">10</property>
    <!--超时时间-->
    <property name="checkoutTimeout">3000</property>
  </default-config>

  <named-config name="otherc3p0"> 
    <!--  连接参数 -->
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</property>
    <property name="user">root</property>
    <property name="password">root</property>
    
    <!-- 连接池参数 -->
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">8</property>
    <property name="checkoutTimeout">1000</property>
  </named-config>
</c3p0-config>
package cn.xxx.datasource.c3p0;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

/**
 * c3p0演示
 */
public class C3P0Demo2 {
    
    

    public static void main(String[] args) throws SQLException {
    
    
       /* //1. 获取DataSource,使用默认配置
        DataSource ds  = new ComboPooledDataSource();

        //2.获取连接

        for (int i = 1; i <= 11 ; i++) {
            Connection conn = ds.getConnection();
            System.out.println(i+":"+conn);

            if(i == 5){
                conn.close();//归还连接到连接池中
            }
        }*/

        //testNamedConfig();

    }


    public static void testNamedConfig() throws SQLException {
    
    
        // 1.1 获取DataSource,使用指定名称配置
        DataSource ds  = new ComboPooledDataSource("otherc3p0");
        //2.获取连接
        for (int i = 1; i <= 10 ; i++) {
    
    
            Connection conn = ds.getConnection();
            System.out.println(i+":"+conn);
        }
    }

}

드루이드

단계:

  1. jar 패키지 druid-1.0.9.jar을 가져옵니다.
  2. 구성 파일을 정의합니다.
    • 속성의 형태로 되어있습니다
    • 어떤 이름으로든 불릴 수 있고 어떤 디렉토리에도 배치할 수 있습니다.
  3. 구성 파일을 로드합니다. 속성
  4. 데이터베이스 연결 풀 개체 가져오기: 팩토리를 통해 DruidDataSourceFactory 가져오기
  5. 연결 가져오기: getConnection

드루이드.속성

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db3
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
package cn.xxx.datasource.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

/**
 * Druid演示
 */
public class DruidDemo {
    
    
    public static void main(String[] args) throws Exception {
    
    
        //1.导入jar包
        //2.定义配置文件
        //3.加载配置文件
        Properties pro = new Properties();
        InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);
        //4.获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        //5.获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);

    }
}

JDBC 유틸리티를 사용하여 연결용 연결 풀 Druid를 캡슐화합니다.

도구 클래스 정의

  1. JDBCUtils 클래스 정의
  2. 구성 파일을 로드하고 연결 풀 개체를 초기화하기 위한 정적 코드 블록 제공
  3. 방법 제공
    1. 연결 받기 방법: 데이터베이스 연결 풀을 통해 연결을 가져옵니다.
    2. 자원 공개
    3. 연결 풀을 얻는 방법
package cn.xxx.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * Druid连接池的工具类
 */
public class JDBCUtils {
    
    

    //1.定义成员变量 DataSource
    private static DataSource ds ;

    static{
    
    
        try {
    
    
            //1.加载配置文件
            Properties pro = new Properties();
            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.获取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     */
    public static Connection getConnection() throws SQLException {
    
    
        return ds.getConnection();
    }

    /**
     * 释放资源
     */
    public static void close(Statement stmt,Connection conn){
    
    
       /* if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn != null){
            try {
                conn.close();//归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }*/

       close(null,stmt,conn);
    }


    public static void close(ResultSet rs , Statement stmt, Connection conn){
    
    


        if(rs != null){
    
    
            try {
    
    
                rs.close();
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
        }


        if(stmt != null){
    
    
            try {
    
    
                stmt.close();
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
        }

        if(conn != null){
    
    
            try {
    
    
                conn.close();//归还连接
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取连接池方法
     */

    public static DataSource getDataSource(){
    
    
        return  ds;
    }

}

package cn.xxx.datasource.druid;

import cn.itcast.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 使用新的工具类
 */
public class DruidDemo2 {
    
    

    public static void main(String[] args) {
    
    
        /*
         * 完成添加操作:给account表添加一条记录
         */
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
    
    
            //1.获取连接
            conn = JDBCUtils.getConnection();
            //2.定义sql
            String sql = "insert into account values(null,?,?)";
            //3.获取pstmt对象
            pstmt = conn.prepareStatement(sql);
            //4.给?赋值
            pstmt.setString(1,"王五");
            pstmt.setDouble(2,3000);
            //5.执行sql
            int count = pstmt.executeUpdate();
            System.out.println(count);
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            //6. 释放资源
            JDBCUtils.close(pstmt,conn);
        }
    }

}

추천

출처blog.csdn.net/weixin_43972437/article/details/132318864