C3P0数据库连接池

简介: C3P0数据库连接池

一:连接池介绍

1、操作数据库都需要创建连接,操作完成还需要关闭连接

2、创建连接和关闭连接需要可能比执行sql需要的时间都长

3、一个网站需要高频繁的访问数据库,如果短时间频繁的访问数据库服务器,就容易造成服务器的宕机,即死机。

1.1连接池解决的问题

在以往的jdbc程序每次访问数据库都需要创建一个新的连接,访问完毕之后,还需要释放资源。那么在这样的一个过程中,连接的创建和销毁所消耗的资源是远远大于我们发送sql并执行的时间的。基于这样的情况,我们发现我们的jdbc程序将大量的资源浪费在了连接的创建和销毁上。

举例:就像在上海坐地铁,就一站2分钟的路程,往往在买地铁票的过程需要等待至少10分钟以上的时间。这样是不合理的。所以我们 需要对这样的结构进行优化。

思考上面的结构,大部分的时间浪费在了创建和销毁上。那么我们能不能实现将这些连接回收和利用呢?这样我们就不需要不停的创建和销毁了。只需要创建一次,放在指定的地方。当我们使用的时候,直接从里面拿就行了。用完放回原来的地方。不去销毁,当我再次使用的时候,去拿就行了。而这样的解决方案就是我们需要的。

优化后的结构如下:

说明:首先创建一定数量的连接,然后放到指定的地方。当我们需要获取连接的时候,直接从指定的地方获取。用完了,我们再将连接放回去。这样就能将我们连接的回收利用。并且不用花费大量时间在创建和销毁连接上。

2.常用的数据库连接池

javax.sql.DataSource表示数据库连接池,DataSource本身只是Sun公司提供的一个接口,没有具体的实现,它的实现由连接池的数据库厂商去实现。我们只需要学习这个工具如何使用即可。

常用的连接池实现组件有以下这些:

  1. 阿里巴巴-德鲁伊Druid连接池:Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。该项目主要是为了扩展JDBC的一些限制,可以让程序员实现一些特殊的需求。
  2. C3P0是一个开源的JDBC连接池,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。C3P0有自动回收空闲连接功能。
  3. DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目。dbcp没有自动回收空闲连接的功能。

二:c3p0介绍

2.1C3P0介绍:

C3P0 是一个开源的JDBC连接池,目前spring 和 hibernate框架对C3P0是支持的。使用c3p0数据库连接池之前,首先需要在资料中找到如下的jar包,加载到项目

2.2C3P0快速入门

1.常用参数说明

参数 说明
driverClass 数据库驱动类。例如:com.mysql.jdbc.Driver
jdbcUrl 连接数据库的url地址。例如:jdbc:mysql://localhost:3306/day05_db
user 连接数据库的用户名。例如:root
password 连接数据库的密码。例如:1234
initialPoolSize 刚创建好连接池的时候连接数量
maxPoolSize 连接池中最多可以放多少个连接

2.API介绍

com.mchange.v2.c3p0.ComboPooledDataSource类表示C3P0的连接池对象,常用2种创建连接池的方式:

1.无参构造,使用默认配置

2.有参构造,使用命名配置

public ComboPooledDataSource()

无参构造使用默认配置(使用xml中default-config标签中对应的参数)


public ComboPooledDataSource(String configName)

有参构造使用命名配置(configName:xml中配置的名称,使用xml中named-config标签中对应的参数)

 

public Connection getConnection() throws SQLException

从连接池中取出一个连接

3.使用步骤

1.导入jar包c3p0-0.9.1.2.jar  

2.编写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://数据库名称</property>
        <property name="user">root</property>
        <property name="password">1234</property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
    </default-config>
 
    <!-- This app is massive! -->
    <named-config name="xx">
    </named-config>
</c3p0-config>
3.将配置文件放在src目录下

4.创建连接池对象ComboPooledDataSource使用默认配置或命名配置  
        //创建数据源(连接池对象)对象,自动加载src根路径下c3p0-config.xml
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
5.从连接池获取对象
1. //获取连接对象
2. Connection conn = dataSource.getConnection();
6.使用对象操作数据库,查询表中所有数据并输出到控制台
      //3)创建发送sql的对象
        Statement stm = conn.createStatement();
        //4)发送sql语句,获取ResultSet结果集
        String selectSql="select * from user";
        ResultSet rs = stm.executeQuery(selectSql);
        //5)解析结果集
        ArrayList<User> users = new ArrayList<>();
        while (rs.next()){
            int id=rs.getInt(1);
            String name=rs.getString("username");
            String password=rs.getString(3);
            User user = new User();
            user.setId(id);
            user.setPassword(password);
            user.setUserName(name);
            users.add(user);
        }
        System.out.println(users);
7.关闭资源
1. //6)close 归还连接对象到连接池
2.         rs.close();
3.         stm.close();
4.         conn.close();

三:使用总结

1.使用事项注意

C3P0配置文件名称必须为c3p0-config.xml

C3P0命名配置可以有多个  

2.使用C3P0的优点

1. 高效性:C3P0数据库连接池通过最小化数据库连接的创建和释放操作,提供快速和高效的数据库连接,从而显著提高了系统的响应速度和性能。

2. 连接管理:C3P0数据库连接池可以自动管理和监控连接的可用性和状态,包括连接的创建、分配、回收和销毁等操作,减轻了开发人员的工作负担。

3. 连接重用:C3P0数据库连接池可以重用已经建立的数据库连接,避免每次都重新创建连接,从而减少了数据库的负载和开销。

4. 连接池配置:C3P0数据库连接池提供了丰富的配置选项,可以根据具体的需求进行灵活的配置,包括最大连接数、最小连接数、连接超时等参数的设置。

5. 连接缓存:C3P0数据库连接池可以缓存数据库连接,避免了频繁地创建和销毁连接的开销,提高了数据库操作的效率。

6. 连接错误处理:C3P0数据库连接池可以处理连接异常和错误情况,包括连接超时、连接池溢出等,提供了容错机制,保证了系统的稳定性和可靠性。

7. 连接监控:C3P0数据库连接池可以监控连接的使用情况和状态,包括连接的活跃数、空闲数等,提供了连接池的性能统计和监控功能。

8. 跨平台兼容性:C3P0数据库连接池是一个开源的Java库,可以在不同的操作系统和数据库系统上使用,具有良好的跨平台兼容性。

相关文章
|
26天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
3天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
352 14
|
19天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
23天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2590 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
5天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
180 2
|
3天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
104 65
|
6天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
321 2
|
23天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1580 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码