数据源 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

    10 30 100 10 200
    复制代码
     <!--配置连接池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-->
     ......
  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

    com.alibaba druid 1.1.21
  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

不常用

相关推荐
GuWenyue1 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
Miao121313 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
CodexDave3 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
碎光拾影3 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
曾阿伦3 小时前
MongoDB 查询语句备忘手册
数据库·mongodb
一叶龙洲4 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
CCPC不拿奖不改名4 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
爬也要爬着前进5 小时前
redis主从搭建
数据库·redis·缓存
@Mike@6 小时前
02-数据库学习笔记(SQL引擎)
数据库·笔记·学习
踏月的造梦星球7 小时前
达梦数据库执行计划与性能分析入门:EXPLAIN、AUTOTRACE 与 ET
服务器·数据库·oracle