数据源 C3PO与Druid

一、概念

存放数据库链接的容器。

当系统初始化好之后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取链接对象,用户访问完之后,会将链接对象归还给容器。

简单来说,使用传统的JDBC方法,每次使用完,都会启动和关闭,这是十分影响系统的性能的。所以,建立一个数据库链接池,每次DOM\BOM操作之后只需要把链接对象归还容器即可。可以达到1. 节约资源 2. 用户访问高效的作用。

二、 C3P0(技术较老)

步骤:1. 导入JAR包

复制代码
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.11</version>
        </dependency>

步骤2 定义配置文件

  1. 名称必须是c3p0.properties 或者 c3p0-config.xml

    <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> </default-config>
    复制代码
     <!--配置连接池mysql-->
     <named-config name="mysql">
         <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
         <property name="jdbcUrl">jdbc:mysql://localhost:3306/qwertyuiop?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC&amp;rewriteBatchedStatements=true</property>
         <property name="user">root</property>
         <property name="password">root</property>
         <property name="initialPoolSize">10</property>
         <property name="maxIdleTime">30</property>
         <property name="maxPoolSize">100</property>
         <property name="minPoolSize">10</property>
         <property name="maxStatements">200</property>
     </named-config>
    
     <!--配置连接池2-->
     ......
    </c3p0-config>
  2. 位置:放在src目录下即可。

  3. 创建核心对象 数据库链接池对象ComboPooledDataSource

4.获取链接

复制代码
package com.itheima.test;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.jupiter.api.Test;

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

public class dataResource {
    @Test
//    测试,手动创建C3P0数据源
    public  void test1() throws SQLException {
//        获取dataSource,使用默认配置
        DataSource ds = new ComboPooledDataSource();//此方法有多个重载,有参的可以调用c3p0-config.xml中的多个数据池
//        获取链接
        for (int i = 1; i < 10; i++) {
            Connection conn = ds.getConnection();
            System.out.println("conn = " + conn);
        }
    }
}

三、Druid(阿里巴巴做的)

Druid技术由阿里团队提供,常用,重点。

使用步骤

  1. 导入jar包 druid

    <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency>
  2. 定义配置文件:

• 配置文件是properties形式

• 可以叫任意名字,可以放在任意的目录下,但是不会主动加载

复制代码
#druid.properties文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/zxcvbnm
username=root
password=root
#初始化链接的数量
initialSize=5
#最大链接数
maxActive=10
#最大超时时间
maxWait=3000
  1. 获取数据库连接池对象,通过工厂类来获取,DruidSourceFactory

  2. 创建核心对象 数据库链接池对象DruidDataSourceFactory

5.获取链接

复制代码
    public  void test1() throws SQLException, IOException {
//        导入jar
//        2. 定义配置文件
//        3. 加载配置文件
        Properties prop = new Properties();
        InputStream is =dataResource.class.getResourceAsStream("druid.properties");
        prop.load(is);
//        4.获取连接池对象
        DataSource ds = DruidDataSourceFactory.createDataSource(prop);
//        5. 获取链接
        Connection conn = ds.getConnection();
        System.out.println("conn = " + conn);
}

上述的步骤还是有些麻烦,于是需要像sql初学时一样,定义工具类

  1. 类名称:JDBCUtils

  2. 提供静态代码快来加载配置文件,初始化连接池对象

  3. 提供的方法:

1.获取链接方法:通过数据库连接池获取链接

  1. 释放资源

3.获取连接池的方法

复制代码
/*Druid连接池工具类*/

import com.alibaba.druid.pool.DruidDataSourceFactory;

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

public class JDBCUtils {
//    1. 定义成员变量DataSOURCE
    private static DataSource dataSource;

    static {
        try {
        //1. 定义成员变量
        Properties prop = new Properties();
        prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//        2. 获取dataSource

            dataSource= DruidDataSourceFactory.createDataSource(prop);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


//    获取链接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }


//    释放资源
    public static void close(Statement statement,Connection connection){
//        if (statement!=null){
//            try {
//                statement.close();
//            } catch (SQLException e) {
//                throw new RuntimeException(e);
//            }
//        }
//        if (connection!=null){
//            try {
//                connection.close();
//            } catch (SQLException e) {
//                throw new RuntimeException(e);
//            }
//        }
        close(null,statement,connection);
    }

    public static void close(ResultSet rs,Statement statement, Connection connection){
        if (rs!=null){
            try {
               rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }

//    获取连接池的方法
    public static DataSource getDataSource(){
        return dataSource;
    }
}

四、DBCP、BoneCP

不常用

相关推荐
m0_569881472 小时前
使用Python进行网络设备自动配置
jvm·数据库·python
Zzxy2 小时前
HikariCP连接池
java·数据库
钰衡大师2 小时前
MySQL 数据库备份方案
数据库·mysql
殷紫川2 小时前
别等业务中断才补坑!RTO/RPO 核心逻辑与全场景灾备架构选型全攻略
数据库·架构
reasonsummer2 小时前
【办公类-133-02】20260319_学区化展示PPT_02_python(图片合并文件夹、提取同名图片归类文件夹、图片编号、图片GIF)
前端·数据库·powerpoint
2401_831920742 小时前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
码哥字节3 小时前
如何在不停机的情况下保证迁移数据库数据的一致性?
数据库
想七想八不如114083 小时前
SQL操作学习
数据库·sql·学习
一只大袋鼠3 小时前
数据库知识点梳理(二):从基础操作到底层原理
数据库·oracle