C3P0连接池的使用

article/2025/10/29 16:54:11

C3P0连接池的使用

  • 什么是连接池?
  • C3P0连接池的使用
    • 什么是C3P0?
    • 环境准备
    • 手动配置
      • 主要步骤
      • 开始编写!
    • 采用配置文件的方式
      • 主要步骤
      • 开始编写!
  • 完整代码及运行结果

什么是连接池?

既然叫做池,那么连接池(Connection Pool)就是存在很多连接的一个“池塘”。它是一种创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。简单来说,连接池就是预先准备好了一些连接对象,当有需要的时候就可以直接用这些已经准备好的连接,无需重新创建连接,在有大量连接需求的场合非常适用

如下图,在传统的JDBC连接中,每一次请求访问数据库都要重新创建一个连接来连接数据库。
在这里插入图片描述
当我们使用连接池技术后,我们会在连接池中放入足够的待使用的连接。打个比方,有一间屋子(数据库),我们如果要进入这个屋子就需要向主人索要钥匙(数据库连接),一两个人主人可以接受,但要是想要进入这间屋子的人一多,主人就显得比较麻烦了,每次都需要给这些人重新配一把钥匙。于是主人为了方便,就在屋子外放了一个盒子(连接池),里面放了好几把提前配好的钥匙供他人使用。这样一来主人就不会那么麻烦了。
在这里插入图片描述

C3P0连接池的使用

什么是C3P0?

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。

环境准备

  • 编译环境:Intelli IDEA
  • 数据库:Mysql 5.7.28
  • C3P0驱动包:c3p0-0.9.1.2.jar
  • Mysql驱动包:mysql-connector-java-5.1.39-bin.jar

驱动包下载地址:https://pan.baidu.com/s/1IeI1r2wFjaxQntu7kS09iA
密码: u086

  • jar包安装过程:详见JDBC入门程序详解
  • 准备数据库数据
    在这里插入图片描述
    在这里插入图片描述

手动配置

主要步骤

  • 创建连接池
  • 设置连接参数
  • 从连接池中获得连接

开始编写!

1.定义三个基础变量

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

2.创建连接池

ComboPooledDataSource dataSource = new ComboPooledDataSource();

C3P0的核心类就是ComboPooledDataSource,我们首先将它实例化,就可以调用该类中用于连接数据库的方法。
 
3.设置连接参数

dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/web_test4?useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("Zjy9201141217");
  • setDriverClass用于加载mysql的驱动,作用与Class.forName("com.mysql.jdbc.Driver");相同。
  • 剩下的三个方法setJdbcUrlsetUsersetPassword中所填的参数与DriverManager.getConnection(url,username,password)所需的三个参数相同,只不过分开填写了,这三个参数的具体的解释详见JDBC入门程序详解。

4.从连接池中获得连接

conn=dataSource.getConnection();

ComboPooledDataSource类中有不带参数的getConnection()方法,执行这一语句后开始向连接池中获取已有的连接。
 

采用配置文件的方式

主要步骤

  • 编写 c3p0-config.xml 文件
  • 创建连接池,默认去类路径查找c3p0-config.xml
  • 从连接池中获得连接

开始编写!

在主要步骤中我们看到了一个新东西-----c3p0-config.xml,这是个什么东西?下面是C3P0的文档:

Named and Per-User configuration: Overriding c3p0 defaults via c3p0-config.xmlGo To Top.As of c3p0-0.9.1, you can define multiple configurations in an XML configuration file, and specify in your code which configuration to use. For any configurations (including the unnamed default configuration), you can define overrides for a particular database user. For example, if several applications access your database under different authentication credentials, you might define maxPoolSize to be 100 for user highVolumeApp, but only 10 for user lowLoadApp. (Recall that Connections associated with different authentication credentials are of necessity separated into separate pools, so it makes sense that these could be configured separately.)You can use the XML config file for all c3p0 configuration, including configuration of defaults. However, for users who don’t want or need the extra complexity, the c3p0.properties file will continue to be supported.By default, c3p0 will look for an XML configuration file in its classloader’s resource path under the name “/c3p0-config.xml”. That means the XML file should be placed in a directly or jar file directly named in your applications CLASSPATH, in WEB-INF/classes, or some similar location.If you prefer not to bundle your configuration with your code, you can specify an ordinary filesystem location for c3p0’s configuration file via the system property com.mchange.v2.c3p0.cfg.xml.

大概就是说,从c3p0-0.9.1开始,我们可以不用在每一次连接中去配置参数,而是可以在c3p0-config.xml中先配置好相关的参数,知道后C3P0可以在类路径查找c3p0-config.xml以获取相关的参数。那么这个xml文件应该放在哪里呢?文档中有这样一句话:

That means the XML file should be placed in a directly or jar file directly named in your applications CLASSPATH, in WEB-INF/classes, or some similar location.

所以我们可以直接将xml文件放到src目录下。下面我们看一下c3p0-config.xml中的代码:

<?xml version="1.0" encoding="UTF-8" ?><c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/web_test4?useSSL=false</property><property name="user">root</property><property name="password">Zjy9201141217</property></default-config><!-- This app is massive! --><named-config name="intergalactoApp"><property name="acquireIncrement">50</property><property name="initialPoolSize">100</property><property name="minPoolSize">50</property><property name="maxPoolSize">1000</property><!-- intergalactoApp adopts a different approach to configuring statement caching --><property name="maxStatements">0</property><property name="maxStatementsPerConnection">5</property><!-- he's important, but there's only one of him --><user-overrides user="master-of-the-universe"><property name="acquireIncrement">1</property><property name="initialPoolSize">1</property><property name="minPoolSize">1</property><property name="maxPoolSize">5</property><property name="maxStatementsPerConnection">50</property></user-overrides></named-config>
</c3p0-config>

「 解释一下xml文件中的部分标签 」

  • <default-config>标签用来编写默认数据库的具体参数
  • <name-config>标签下用来编写备用的数据库
  • <property>中则是具体的参数值,如url,username,password等
  • initialPoolSize初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间。默认值是3.
  • minPoolSize连接池中保留的最小连接数。默认为:3
  • maxPoolSize连接池中保留的最大连接数。默认为:15
  • maxIdleTime最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0
  • maxStatementsc3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值: 0

配置完xml后,java代码就可以这样写:

//创建连接池默认去类路径查找c3p0-config.xml
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//从连接池中获得连接
conn=dataSource.getConnection();

如果需要用备用的数据库,那吗就在ComboPooledDataSource()的中写上<name-config name="oracle">的name(oracle),ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");就可以加载相应的数据库。如果ComboPooledDataSource(...)找不到相应的备用数据库,那么就启用默认的数据库。

完整代码及运行结果


public class JDBCUtils {public static void release(ResultSet rs,Statement stmt,Connection conn) {if(stmt!=null) {try {stmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}stmt=null;}if(conn!=null) {try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}conn=null;}if(rs!=null) {try {rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}rs=null;}}
}
}

import com.itheima.jdbc.utils.JDBCUtils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** C3P0连接池的测试*/public class C3P0Demo1 {@Test/*** 配置文件方式*/public void demo2(){Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try{//获得连接:从连接池中获得//创建连接池://创建连接池默认去类路径查找c3p0-config.xmlComboPooledDataSource dataSource = new ComboPooledDataSource();//从连接池中获得连接conn=dataSource.getConnection();String sql = "select * from account";//预编译Sqlpstmt=conn.prepareStatement(sql);//执行SQlrs=pstmt.executeQuery();while (rs.next()){System.out.println(rs.getInt("id")+" "+rs.getString("name")+" "+rs.getDouble("money"));}}catch (Exception e){e.printStackTrace();}finally {JDBCUtils.release(rs,pstmt,conn);}}/*** 手动设置参数的方式*/public void demo1(){Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try{//获得连接:从连接池中获得//创建连接池ComboPooledDataSource dataSource = new ComboPooledDataSource();//设置连接参数dataSource.setDriverClass("com.mysql.jdbc.Driver");dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/web_test4?useSSL=false");dataSource.setUser("root");dataSource.setPassword("Zjy9201141217");//从连接池中获得连接conn=dataSource.getConnection();String sql = "select * from account";//预编译Sqlpstmt=conn.prepareStatement(sql);//执行SQlrs=pstmt.executeQuery();while (rs.next()){System.out.println(rs.getInt("id")+" "+rs.getString("name")+" "+rs.getDouble("money"));}}catch (Exception e){e.printStackTrace();}finally {JDBCUtils.release(rs,pstmt,conn);}}
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/myACqcnZ.shtml

相关文章

C3P0连接池配置文档

一、导入jar包 下载链接 二、配置文件 配置文件名称&#xff1a;c3p0-config.xml (固定) 配置文件路径&#xff1a;src (类路径) 配置文件内容&#xff1a;命名配置 <c3p0-config><!-- 命名的配置 --><named-config name"test"><!-- 连接数…

C3P0数据库连接池的配置

在pom.xml文件中导入jar包 <dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version> </dependency> 在src目录下创建c3p0-config.xml文件 <c3p0-config><named-config …

C3P0连接池的基本配置与使用

上一期我写了一篇Druid连接池的基本配置与使用&#xff0c;今天我要介绍一下C3P0连接池的基本使用。因为是介绍基本使用&#xff0c;所以我打算用一个非常简单的java应用来教大家如何对C3P0连接池进行基本配和使用。所以你只要有jdbc和Java基础就能看懂这篇文章&#xff0c;并学…

Windows API编程(一)最基础的知识介绍:Windows编程基础

主要内容简介&#xff1a; 1. Windows 编程基础&#xff1a;开发环境和开发过程。 2. Windows事件驱动模型和消息机制。 3. Windows的资源&#xff1a;图标、光标、菜单、位图等。 4. Windows绘图&#xff1a;图形和文字的显示。 5. 对话框和控件。 6. 静态库和动态库。 …

通过一个最简单的程序入门Windows编程

一、最简单的程序 我们首先先一个最简单的Windows程序&#xff0c;功能是显示一个消息框&#xff0c;随便提示一些文字就可以了。 看一下代码&#xff1a; #include <Windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, in…

windows编程 线程局部存储(TLS)详解

文章目录 一、基本概念二、基本使用三、例子分析&#xff1a; 总结 一、基本概念 线程局部存储&#xff08;TLS&#xff09;&#xff0c;是一种变量的存储方法&#xff0c;这个变量在它所在的线程内是全局可访问的&#xff0c;但是不能被其他线程访问到&#xff0c;这样就保持…

windows编程入门

记录一下windows编程编写一个消息框&#xff0c;算是学习windows编程的入门级程序吧 以下代码来自&#xff1a;《windows游戏编程大师技巧&#xff08;第二版&#xff09;》 #include<Windows.h> #include<windowsx.h> #include<string> #include<sstre…

Windows编程捕获特定窗口及键盘鼠标消息模拟

Windows编程捕获特定窗口及键盘鼠标消息模拟 一、简介二、使用到的API简介三、获取Windows记事本的编辑区窗口的句柄并模拟输入操作1、分析2、代码一3、代码二 四、后记 一、简介 窗口是Windows的核心组件&#xff0c;Windoows下的绝大部分应用都是利用Windows提供的原生窗口&…

【Windows编程】实时捕捉屏幕

实时捕捉屏幕 主要分为三个部分 获取屏幕 // 两个函数都可以进行位图复制&#xff0c;不过StretchBlt可以按照位图进行拉伸或者压缩 BitBlt(HDC hdc,int x,int y,int cx,int cy,HDC hdcSrc,int x1,int y1,DWORD rop); 或者 StretchBlt(HDC hdcDest,int xDest,int yDest,int …

Windows编程初步(一)

第一节:安装帮助文档 使用C语言进行Windows开发,必然使用到WindowsSDK。Windows SDK指Windows开发人员工具包,是为使用C语言开发Windows程序所提供的工具集。里面提供的工具异常全面丰富,很少有人能全部了解,在开发Windows应用程序时,应同时使用MSDN,即俗称Windows开发…

Windows编程

Windows编程基础 Windows系统级开发&#xff0c;简称Win32 应用程序分类 在Windows这个操作系统平台上&#xff0c;共有三类应用程序控制台程序Console Dos程序&#xff0c;本身没有窗口&#xff0c;通过Windows DOS窗口执行 窗口程序 拥有自己的窗口&#xff0c;可以与用户…

【Windows编程】windows窗口创建过程详解

文章目录 前言1 应用程序的分类2 应用程序分类的对比3 编译工具4 windows库文件和头文件5 WinMain函数和MessageBox函数初始6 窗口类7 窗口类的分类8 注册窗口类函数9 注册窗口类的结构体10 注册全局和局部窗口类11 创建窗口的函数12 创建一个windows的过程步骤13 创建一个子窗…

windows系统编程1——线程和进程

学习视频链接 03进程的创建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Fd4y1G7Td?p3&vd_source0471cde1c644648fafd07b54e303c905 目录 一、创建线程 二、线程间同步 2.1 线程不同步的结果 2.2 原子操作上锁 2.3 临界区 2.4 内核对象 三、线程间通信…

day01 windows编程入门

文章目录 window编程基本概念Windows常见的数据类型字符串的处理 第一个windows程序的编写 window编程基本概念 Windows编程的本质就是使用好操作系统&#xff0c;想要用好操作系统必不可少的秘籍----MSDN。 Windows编程主要分为两种&#xff1a; 1、控制台编程(CUI) 2、图形界…

10行代码带你入门Windows编程

Windows编程——Hello World 开发工具效果展示源代码主函数主函数参数HINSTANCEhInstanccehPreInstanceLPSTRlpCmdLinenCmdShowMessageBox 小知识 开发工具 Visual Studio 2013 效果展示 源代码 #include <Windows.h> //头文件//主函数 int WINAPI WinMain(HINSTANC…

使用VS Code进行Qt开发

使用VS Code进行Qt开发 文章目录 使用VS Code进行Qt开发测试环境步骤1. 将Qt的bin目录添加到环境变量2. 安装VS Code扩展3. 使用Qt Creator创建CMake项目4. 在VS Code中打开项目5. 构建并运行项目7. 调试项目 一些小问题 Qt Creator界面不美观&#xff0c;而VS Code更漂亮一些。…

Qt开发CAN通信的环境配置

Qt开发CAN通信的环境配置 目录 1 开发环境 1 1.1 编程环境 1 1.2 工程设置 1 1.3 调试窗口设置 2 1.4 依赖库 2 1.5 源代码的适配 3 2 运行及硬件环境 3 2.1 CAN设备 3 2.4 运行支持文件 3 3 故障解决 4 3.1 转到槽函数失败 4 1 开发环境 1.1 编程环境 工程采用Windows系统下的…

Qt开发必备技术栈学习路线和资料

简介 本文为&#xff1a;C QT 学习路线大纲资料&#xff08;文章底部&#xff09; Qt 可以做什么&#xff1f; Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控…

WIndows下搭建Qt开发环境 -- Qt 、Qt Creater 安装、配置

[本文发布于https://blog.csdn.net/Stack_/article/details/122491885&#xff0c;未经许可不得转载&#xff0c;转载须注明出处] 一、需要下载安装哪些文件 1Qt SDK&#xff0c;即Qt官方提供的API2编辑器、UI设计器 – Qt Creater3编译器 其中Qt Creater是可以被Visual Studi…

Qt开发MQTT(一) 之Qt官方Qt MQTT

概述 Qt开发MQTT程序有两种方式&#xff0c;一个是Qt官方提供的基于MQTT的封装&#xff0c;一个是第三方&#xff08;EMQ&#xff09;开发的用于Qt调用MQTT的接口&#xff0c;二者使用方法大同小异&#xff0c;并且均提供了源码。那么&#xff0c;这里先来介绍第一种&#xff…