C3P0、DBCP、Druid 三种数据库连接池的使用

news2025/5/24 9:46:48

文章目录

  • 数据库连接池
    • 1 C3P0 数据库连接池
    • 2 DBCP 数据库连接池
    • 3 Druid 数据库连接池

数据库连接池

  • JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
    • DBCP 是Apache提供的数据库连接池。tomcat 服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。
    • C3P0 是一个开源组织提供的一个数据库连接池,**速度相对较慢,稳定性还可以。**hibernate官方推荐使用
    • Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
    • BoneCP 是一个开源组织提供的数据库连接池,速度快
    • Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不确定是否有BoneCP快
  • DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池
  • DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度。
  • 特别注意:
    • 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
    • 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但conn.close()并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。

附三种数据库连接池 jar 包,官网的下载地址:
https://blog.csdn.net/weixin_43671437/article/details/134141851?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22134141851%22%2C%22source%22%3A%22weixin_43671437%22%7D

1 C3P0 数据库连接池

1 导包
在这里插入图片描述

2 编写配置文件
创建 c3p0-config.xml 文件, 注意文件名字不能改。

<?xml version="1.0" encoding="utf-8" ?>
<c3p0-config>

    <named-config name="helloC3P0">
        <!-- 提供获取连接的4个基础信息 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>        <!-- &amp; xml文件中的 & 符号 -->
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_learn?useUnicode=true&amp;characterEncoding=utf8&amp;rewriteBatchedStatements=true</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <!--  进行数据库连接池管理的基本信息-->
        <!--  当数据库连接池中的连接数不够时,C3P0一次性向数据库申请的连接数 -->
        <property name="acquireIncrement">5</property>
        <!--  c3p0数据库连接池初始化时的连接数 -->
        <property name="initialPoolSize">10</property>
        <!--  c3p0数据库连接池维护的最小的连接数 -->
        <property name="minPoolSize">50</property>
        <!--  c3p0数据库连接池维护的最大的连接数 -->
        <property name="maxPoolSize">100</property>
        <!--  c3p0数据库连接池最多维护的Statements的个数 -->
        <property name="maxStatements">50</property>
        <!--  每个连接中可以最多使用的Statement的个数 -->
        <property name="maxStatementsPerConnection">2</property>

    </named-config>
</c3p0-config>

3 编写连接池代码

/**
 * ClassName: C3P0Test
 * Description:
 *		C3P0数据库连接池 测试类
 * @Create 2023/11/1 18:36
 * @Version 1.0
 */
public class C3P0Test {
    // 方式一:
    @Test
    public void getConnection() throws PropertyVetoException, SQLException {
        // 创建 C3P0 数据库连接池
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        // 设置基本信息
        cpds.setDriverClass( "com.mysql.cj.jdbc.Driver" ); //loads the jdbc driver
        cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/jdbc_learn?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true" );
        cpds.setUser("root");
        cpds.setPassword("root");
        // 通过设置相关参数,对数据库连接池进行管理
        // 设置数据库链接池中的链接数
        cpds.setInitialPoolSize(10);

        // 获取连接
        Connection conn = cpds.getConnection();
        System.out.println(conn);

        // 销毁c3p0数据库连接池 一般不会做这个操作
        // DataSources.destroy(cpds);
    }

    // 方式二:使用配置文件
    @Test
    public void getConnection2() throws Exception {
        // // 创建 C3P0 数据库连接池
        ComboPooledDataSource cpds = new ComboPooledDataSource("helloC3P0");
        // 获取连接
        Connection conn = cpds.getConnection();
        System.out.println(conn);
    }

}

2 DBCP 数据库连接池

1 导包
将这两个包导入项目内
在这里插入图片描述

2 编写配置文件

创建 dbcp.properties 文件, 注意文件名字不能改。

username=root
password=root
url=jdbc:mysql://localhost:3306/jdbc_learn?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
driverClassName=com.mysql.cj.jdbc.Driver

initialSize=10

3 编写连接池代码


/**
 * ClassName: DBCPTest
 * Description: 测试DBCP数据库连接池
 *
 * @Create 2023/11/2 14:42
 * @Version 1.0
 */
public class DBCPTest {

    // 方式一: 不推荐
    @Test
    public void testGetConnection() throws SQLException {
        // 创建DBCP的数据库连接池
        BasicDataSource source = new BasicDataSource();

        // 设置基本信息
        source.setDriverClassName("com.mysql.cj.jdbc.Driver");
        source.setUrl("jdbc:mysql://localhost:3306/jdbc_learn?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true");
        source.setUsername("root");
        source.setPassword("root");

        // 还可以设置其他涉及数据库连接池的管理的属性
        source.setInitialSize(10);
        source.setMaxActive(10);
        
        // 获取一个连接
        Connection conn = source.getConnection();
        System.out.println(conn);

    }

    // 方式二:使用配置文件  推荐
    @Test
    public void testGetConnection2() throws Exception {
        Properties pros = new Properties();
        // 读取配置文件
        // 方式一:
        //InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties");
        // 方式二:
        FileInputStream is = new FileInputStream(new File("src/main/resources/dbcp.properties"));
        pros.load(is);
        // 创建数据库连接池
        DataSource source = BasicDataSourceFactory.createDataSource(pros);
        // 获取一个连接
        Connection conn = source.getConnection();
        System.out.println(conn);
    }

}

3 Druid 数据库连接池

1 导包
在这里插入图片描述

2 编写配置文件
创建 druid.properties 文件, 注意文件名字不能改。

username=root
password=root
url=jdbc:mysql://localhost:3306/jdbc_learn?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
driverClassName=com.mysql.cj.jdbc.Driver

initialSize=10
maxActive=10

3 编写连接池代码

/**
 * ClassName: DruidTest
 * Description:
 *          Druid数据库连接池 测试
 * @Create 2023/11/2 15:31
 * @Version 1.0
 */
public class DruidTest {

    @Test
    public void testGetConnection() throws Exception {
    	// 读取配置文件
        Properties pros = new Properties();
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
        pros.load(is);
        // 创建连接池
        DataSource source = DruidDataSourceFactory.createDataSource(pros);
        // 获取一个连接
        Connection conn = source.getConnection();
        System.out.println(conn);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1169987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloudTencent(上)

SpringCloudTencent 1.PolarisMesh介绍2.北极星具备的功能3.北极星包含的组件4.功能特性1.服务管理1.服务注册2.服务发现3.健康检查 2.配置管理 5.代码实战1.环境准备2.服务注册与发现3.远程调用 1.PolarisMesh介绍 1.北极星是腾讯开源的服务治理平台&#xff0c;致力于解决分…

Dev-C调试的基本方法2-1

在Dev-C中调试程序&#xff0c;首先需要在程序中设置断点&#xff0c;之后以调试的方式运行程序。 1 设置断点 当以调试的方式运行程序时&#xff0c;程序会在断点处停下来。点击要设置断点代码行号左侧部分&#xff0c;此时会有如图1所示的红点和绿色对勾&#xff0c;表示断…

Mybatis与Mybatis-Plus(注解与Xml)(单表与多表)

准备工作 这里我们准备了两个与数据库表对应的实体类&#xff0c;stu为学生表&#xff0c;cls为班级表 类属性上的注解如 TableId等 为Mybatis-Plus的注解&#xff0c;使用mybatis会无视掉这些注解 在Stu 类的最后一个属性我们定义了Cls实体类的对象&#xff0c;对于单表查询&…

使用php打印时间精确到毫秒及毫秒转成11位时间戳

在PHP中&#xff0c;可以使用microtime函数来获取当前时间&#xff0c;包括毫秒。以下是示例代码&#xff1a; // 获取当前时间戳&#xff08;秒&#xff09; $time microtime(true); // 将当前时间戳转换为毫秒 $milliseconds round($time * 1000); // 输出当前时间&#…

【C语法学习】12 - scanf()函数

文章目录 0 前言1 函数原型2 参数2.1 格式字符串2.1.1 转换说明 2.2 参数列表 3 返回值4 读取机制4.1 基本概念4.2 转换说明4.3 读取过程4.4 读取示例4.5 多参数 6 示例6.1 示例16.2 示例26.3 示例36.4 示例4 0 前言 scanf()函数虽然使用起来较为灵活&#xff0c;但是其读取机…

SpringBoot集成JPA实现分页和CRUD

SpringBoot集成JPA实现分页和CRUD 文章目录 SpringBoot集成JPA实现分页和CRUDpom.xmlapplication.propertiesaddCategory.jspeditCategory.jsphello.jsplistCategory.jspCategoryCategoryDAOCategoryServiceCategoryServiceImplPage4NavigatorRedisConfigCategoryControllerHel…

CH10_简化条件逻辑

分解条件表达式&#xff08;Decompose Conditional&#xff09; if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd))charge quantity * plan.summerRate; elsecharge quantity * plan.regularRate plan.regularServiceCharge;if (summer())…

C#中List<T>的 AddRange方法使用说明

文章目录 C#中List<T>的 AddRange方法使用说明 C#中List的 AddRange方法使用说明 AddRange可以一次性添加集合A到当前集合B。 本身不能为空&#xff0c;但是可以保存null的数据。 List 中会保留集合中元素的顺序 将集合A添加到集合B的末尾 本身为null&#xff0c;使用 A…

国际测试委员会BenchCouncil首发“开源系统杰出成果榜” 百度飞桨上榜

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

轻量封装WebGPU渲染系统示例<14>- 多线程模型载入(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/ModelLoadTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见&#xff1a;引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔离。 …

uniapp 解决H5跨域的问题

uniapp 解决h5跨域问题 manifest.json manifest.json文件中&#xff0c;点击“源码视图”,在此对象的最后添加以下代码&#xff1a; "h5" : {"devServer" : {"port" : 8080, //端口号"disableHostCheck" : true,"proxy" :…

作为一个初学者,入门大模型其实没那么难

在生成式 AI 盛行的当下&#xff0c;你是否被这种技术所折服&#xff0c;例如输入一段简简单单的文字&#xff0c;转眼之间&#xff0c;一幅精美的图片&#xff0c;又或者是文笔流畅的文字就展现在你的面前。 相信很多人有这种想法&#xff0c;认为生成式 AI 深不可测&#xf…

通过@ConfigrationProperties读取配置文件属性并赋值

这种设计使得 Anything 成为 Something 类的静态成员&#xff0c;因此不依赖于外部类的实例。静态内部类通常更独立&#xff0c;它们可以单独存在且无需引用外部类的实例。 如果将 Anything 类定义为非静态的内部类&#xff0c;它将依赖于 Something 类的实例。这意味着每个 S…

Sybase PowerDesigner 16.7.7.7536 Crack

Power Designer 是Sybase公司的CASE工具集&#xff0c;使用它可以方便地对管理信息系统进行分析设计&#xff0c;他几乎包括了数据库模型设计的全过程。利用Power Designer可以制作数据流程图、概念数据模型、物理数据模型&#xff0c;还可以为数据仓库制作结构模型&#xff0c…

安装Nginx并且添加fastDFS模块

安装Nginx并且添加fastDFS模块 因为这个模块必须在Nginx的安装的过程中才能添加&#xff0c;所有我们需要重新安装一个nginx&#xff0c;为了和原来已安装的Nginx进行区分&#xff0c;我们把新安装的Nginx取名为nginx_fdfs 将Nginx的tar包上传到Linux上 解压上传的Nginx文件 …

C++初阶(七)类和对象

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、流插入流提取1、流插入演示2、流提取演示3、cplusplus推荐 二、const成员三、取地址及con…

Ubuntu更新apt-get安装镜像源

前往清华开源镜像站获取镜像链接 修改镜像源&#xff0c;打开配置文件&#xff0c;将镜像源链接粘贴到配置文件 sudo vim /etc/apt/sources.list更新软件列表到本地 sudo apt-get update更新所有软件&#xff08;非必要&#xff09; sudp apt-get upgrade

Leetcode—100.相同的树【简单】

2023每日刷题&#xff08;十八&#xff09; Leetcode—100.相同的树 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSameTree(struct TreeNode* p, struc…

如何当好一面面试官?

最近公司恢复了招聘&#xff0c;重新启动了校招流程&#xff0c;现在都已经 11 月了&#xff0c;刚好赶上校招黄金期&#xff0c;不过提前批的时间已经过了&#xff0c;也是有点神奇。 公司停止招聘好久了&#xff0c;突然重启&#xff0c;赶忙赶急地让我们推荐面试官&#xf…

「Verilog学习笔记」异步复位的串联T触发器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 这道题目里我们有两个需要明确的点&#xff1a; 1. 什么是异步复位 2. 什么是串联的T触发器 关于第一个点&#xff0c;可以看我的这篇文章&#xff0c;已经整理好了&a…