JDBC --- 数据库连接池 C3P0

news2024/9/22 6:03:05

目录

1、基本定义

2、使用C3P0(数据库连接池)的必要性

2.1.JDBC传统模式开发存在的主要问题

2.1.1时间和内存资源消耗巨大

2.1.2 有内存泄漏的风险

3、数据库连接池的详细说明

4、使用连接池的明显优势

4.1.资源的高效利用

4.2.更快的系统反应速度

4.3.减少了资源独占的风险

4.4.统一的连接管理,避免数据库连接泄露

5.C3P0操作步骤

5.1.导入jar包 

5.2.配置xml文件

5.3.创建C3P0Util类

6.c3p0-config.xml参数清单


1、基本定义

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

  即将用于连接数据库的连接整合在一起形成一个随取随用数据库连接池(Connection pool)。

2、使用C3P0(数据库连接池)的必要性

  当我们在进行基于数据库的web程序开发时,我们可以先在主程序(如Servlet、Bean)中通过JDBC中的DriverManager建立数据库连接,然后将要对数据库进行操作的sql语句封装到Statement中,最后在返回结果集后断开数据库连接。以上是较为传统的开发模式,然而用这种模式开发会埋下严重的安全隐患。

2.1.JDBC传统模式开发存在的主要问题

2.1.1时间和内存资源消耗巨大

      普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再根据JDBC代码(或配置文件)中的用户名和密码进行验证其正确性。这一过程一般会花费0.05~1s,一旦需要数据库连接的时候就必须向数据库请求一个,执行完后再断开连接。显然,如果同一个数据库在同一时间有数十人甚至上百人请求连接势必会占用大量的系统资源,严重的会导致服务器崩溃。

2.1.2 有内存泄漏的风险

      因为每一次数据库连接使用完后都需要断开连接,但如果程序出现异常致使连接未能及时关闭,这样就可能导致内存泄漏,最终只能以重启数据库的方法来解决;

      另外使用传统JDBC模式开发不能控制需要创建的连接数,系统一般会将资源大量分出给连接以防止资源不够用,如果连接数超出一定数量也会有极大的可能导致内存泄漏。

3、数据库连接池的详细说明

  为了解决由使用传统开发模式创建连接导致的一系列问题,我们可以采用数据库连接池技术。

  数据库连接池的基本原理就是为数据库建立一个缓冲池。在缓冲池中先创建指定数量的数据库连接,当有连接请求时就从缓冲池中取出处于“空闲”状态的连接,并将此连接标记为“忙碌”,直到该请求进程结束后,它所使用的连接才会重新回到“空闲”状态,并等待下一次请求调用。

  从上面不难看出数据库连接池的主要作用就是负责分配、管理和释放数据库连接,它允许程序重复使用同一个现有的数据库连接,大大缩短了运行时间,提高了执行效率。

  这里需要强调一点的是,数据库连接池中的连接数是在其初始化时根据c3p0-config.xml中的最小连接数来确定的,关于c3p0-config.xml我会在后文提供模板以供大家参考。当然,无论连接池的连接数是否有被使用,它都至少会保持最小连接数,如果请求连接数超过最小连接数也会根据c3p0-config.xml中指定的自增长数增加连接数直到达到最大连接数,这时如果请求连接数量还是大于连接池中的连接数的话,剩下的请求将会被放入等待队列直到有空闲连接出现。

  这样一来,数据库连接池相较于传统JDBC模式等到请求发出才创建连接的做法有着显而易见的优势。

4、使用连接池的明显优势

4.1.资源的高效利用

  由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销,减小了系统资源消耗的同时也提高了系统运行环境的平稳性。

4.2.更快的系统反应速度

  数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接可以避免数据库在连接初始化和释放过程所需的时间开销,从而减少了系统的响应时间,提高了系统的反应速度。

4.3.减少了资源独占的风险

  新的资源分配手段对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置实现对某一应用最大可用数据库连接数的限制,避免了应用独占所有数据库资源的风险。

4.4.统一的连接管理,避免数据库连接泄露

  在实现较为完善的数据库连接池时,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露。

5.C3P0操作步骤

5.1.导入jar包 

在pom.xml文件中的  <dependencies>加入下面代码

   <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

5.2.配置xml文件

 文件名必须是c3p0-config.xml

<c3p0-config>
    <named-config name="mysqlapp">
        <!-- 提供获取连接的4个基本信息 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://192.168.152.184:3306/jdbcstudb</property>
        <property name="user">root</property>
        <property name="password">123456</property>

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

5.3.创建C3P0Util类

import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class c3p0Util {
    private static DataSource dataSource = null;

    static {
        dataSource = new ComboPooledDataSource("mysqlapp");
    }

    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

相较于JDBC,使用C3P0能够更加高效地建立与数据库的连接,尤其是在高并发随机访问数据库的时候;

C3P0通过dataSource.getConnection()从线程池中获取“空闲”连接,真正的数据库连接创建与释放则是由C3P0在后台自行完成的,我们只花费了获取和释放连接占用权的时间;

使用c3p0-config.xml代替原来JDBC硬编码的形式,提高了代码复用性。

6.c3p0-config.xml参数清单

    <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->   
    <property name="acquireIncrement">3</property>   
 
    <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->   
    <property name="acquireRetryAttempts">30</property>   
       
    <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->   
    <property name="acquireRetryDelay">1000</property>   
       
    <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->   
    <property name="autoCommitOnClose">false</property>   
       
    <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么   
    属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试   
    使用。Default: null-->   
    <property name="automaticTestTable">Test</property>   
       
    <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效   
    保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试   
    获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->   
    <property name="breakAfterAcquireFailure">false</property>   
       
    <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出   
    SQLException,如设为0则无限期等待。单位毫秒。Default: 0 -->   
    <property name="checkoutTimeout">100</property>   
       
    <!--通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。   
    Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->   
    <property name="connectionTesterClassName"></property>   
       
    <!--指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可   
    Default: null-->   
    <property name="factoryClassLocation">null</property>   
       
    <!--强烈不建议使用该方法,将这个设置为true可能会导致一些微妙而奇怪的bug-->   
    <property name="forceIgnoreUnresolvedTransactions">false</property>   
       
    <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->   
    <property name="idleConnectionTestPeriod">60</property>   
       
    <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->   
    <property name="initialPoolSize">3</property>   
       
    <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->   
    <property name="maxIdleTime">60</property>   
       
    <!--连接池中保留的最大连接数。Default: 15 -->   
    <property name="maxPoolSize">15</property>   
       
    <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements   
    属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。   
    如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->   
    <property name="maxStatements">100</property>   
       
    <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->   
    <property name="maxStatementsPerConnection"></property>   
       
    <!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能   
    通过多线程实现多个操作同时被执行。Default: 3-->   
    <property name="numHelperThreads">3</property>   
       
    <!--当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0   
    的数据源时。Default: null-->   
    <property name="overrideDefaultUser">root</property>   
       
    <!--与overrideDefaultUser参数对应使用的一个参数。Default: null-->   
    <property name="overrideDefaultPassword">password</property>   
       
    <!--密码。Default: null-->   
    <property name="password"></property>   
       
    <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:   
    测试的表必须在初始数据源的时候就存在。Default: null-->   
    <property name="preferredTestQuery">select id from test where id=1</property>   
       
    <!--用户修改系统配置参数执行前最多等待300秒。Default: 300 -->   
    <property name="propertyCycle">300</property>   
       
    <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的   
    时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable   
    等方法来提升连接测试的性能。Default: false -->   
    <property name="testConnectionOnCheckout">false</property>   
       
    <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->   
    <property name="testConnectionOnCheckin">true</property>   
       
    <!--用户名。Default: null-->   
    <property name="user">root</property>   
       
    <!--早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数   
    允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始   
    广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到   
    支持,但今后可能的版本可能不支持动态反射代理。Default: false-->   
    <property name="usesTraditionalReflectiveProxies">false</property> 

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

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

相关文章

linux中awk命令和argxs命令的详解使用

一 awk命令1.1 命令的作用awk为行命令处理器&#xff0c;对每一行的文本数据&#xff0c;进行格式化文本信息。目的&#xff1a;在处理庞大文件时不会出现内存溢出或是处理缓慢的问题。1.2 案例应用获取某一行文本数据&#xff0c;提取不同字段的值。1.显示整行数据[rootlocalh…

怎么把照片合成一张?看完这篇文章你就知道了

大家平时有没有遇到过这样的情况&#xff1f;好朋友们组团一起出去玩&#xff0c;但是你因为个人原因无法跟大家一起去。这就可能导致姐妹中的合照少了你一个人&#xff0c;那么要怎样在图片上添加你去了的效果呢&#xff1f;其实很简单&#xff0c;只要编辑图片进行合成就可以…

指针进阶(1)

( )> [ ] > -> > -- > . > * &#xff08;优先级比较&#xff09; tips 1. &#xff08;全是笔者个人自己总结&#xff0c;仅供参考&#xff0c;随意取用&#xff09; 2. 3. 地址唯一标识一块内存空间 4. printf%s打印字符串的话只要给一个起始地址…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第二篇】(持续更新中)

在第一篇中我们讲述了Vue3框架的搭建以及Vue3的常用语法&#xff0c;这篇文章将使用 Axios 和 Element Plus 并使用封装组件的方式完成表格搭建。 本期需要掌握的知识如下: 引入并封装 Axios 请求配置 .env 文件通过 api 接口获取数据 下期需要掌握的知识如下: 组件的封装和…

MySQL主从延迟的解决方案

1、MySQL主从延迟的解决方案 之前项目中基于 MySQL 主从复制以及 AOP 的方式实现了读写分离&#xff0c;也写了博客记录了这个实现过程。既然配置了 MySQL 主从复制&#xff0c;那么自然会存在主从延迟&#xff0c;如何尽可能减小主从延迟对应用系统的影响是很有必要的思考点&a…

特征工程原理(一)

一、定义 在机器学习原理中讲过机器学习的基本流程&#xff0c;其中很重要的一个环节就是特征工程。 1.1 基本概念 特征工程&#xff08;Feature Engineering&#xff09;&#xff1a;从原始数据中提取特征的过程&#xff0c;这些特征可以很好地描述数据&#xff0c;并且利用…

Showdoc升级版本记录

目录 Showdoc介绍 升级步骤 1.备份当前版本 2.下载安装最新版本 总结步骤&#xff1a; Showdoc介绍 ShowDoc是一个非常适合IT团队的在线API文档、技术文档工具。通过showdoc&#xff0c;你可以方便地使用markdown语法来书写出美观的API文档、数据字典文档、技术文档、在线…

GitHub创建仓库,使用SSH建立连接(github创建仓库,github使用SSH建立连接)

GitHub简介&#xff1a;GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;也是一个开源代码库以及版本控制系统&#xff0c;Github拥有超过900万开发者用户&#xff0c;已经成为了管理软件开发以及发现已有代码的首选方法。 怎样创建仓库并使用&#xff1f;详细操作步…

FTP错误代码

本文迁移自本人网易博客&#xff0c;写于2015年4月15日&#xff0c;FTP错误代码 - lysygyy的日志 - 网易博客 (163.com)1、12003错误指定用户未添加到有权限的组中&#xff1b;即指定用户没有权限。2、CFtpFileFind.FindFile GetLastError 12110 &#xff08;1&#xff09;当递…

对比学习综述

一 . 发展历程大概可以分为四个阶段 1、百花齐放&#xff1a;在这个阶段中&#xff0c;方法、模型、目标函数、代理任务都还没有统一&#xff0c;所以说是一个百花齐放的时代。 InstDisc&#xff08;instance discrimination&#xff09;CPCCMC 2、CV双雄&#xff1a;这个阶…

十六、xml、单元测试、注解、单例模式

xml 1.概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为止&…

新提案,初识CSS的object-view-box属性

在开发时&#xff0c;一直希望有一种原生的css方式来裁剪图片&#xff0c;并将其定位在我需要的任何方向。这可以通过使用一个额外的html元素和不同的CSS属性来实现&#xff0c;后面解释。在这篇文章中&#xff0c;将带领大家了解Jake Archibald在今年年初提出的新的CSS属性obj…

VisionBank AI实现4项技术突破----传统算法融合深度学习,重新定义“工业视觉检测大脑”

机器视觉经过长时间的发展&#xff0c;技术不断取得重大突破并被广泛应用&#xff0c;当前已遍布工业生产的各个环节。而且机器视觉易于实现自动化集成&#xff0c;软件集成&#xff0c;是实现智能制造的基础技术。据统计&#xff0c;中国的机器视觉市场需求近几年处于持续高速…

【目标检测】ROI Pool和ROI Align的区别

这里说一下ROI Pool和ROI Align的区别&#xff1a; 一、ROI Pool层 参考Faster RCNN中的ROI Pool层&#xff0c;功能是将不同size的ROI区域映射到固定大小的feature map上。 它的缺点&#xff1a;由于两次量化带来的误差&#xff1b; 将候选框边界量化为整数点坐标值将量化…

【Vue】后台管理系统

O 项目说明 1.脚手架 vitevue-cli 》 webpack 2.vite脚手架使用 官网&#xff1a;https://vitejs.cn/ Vue3 vite官网&#xff1a;https://cn.vitejs.dev/ Vite下一代的前端工具链&#xff0c;为开发者提供急速响应 # 安装 $ cnpm i vite -g $ vite -v vite/4.0.3 darwin…

Sentinel + Redis + Mysql + RabbitMQ 秒杀功能设计及后端代码实现

文章目录前言数据一致性高性能动静分离静态资源缓存流控缓存数据库消息队列RabbitMQ的优点高并发分布式锁后端代码实现中间件表结构添加依赖公共常量实体类Redission配置定时任务Controller下单接口付款接口接收通道消息完整代码前言 在开发秒杀系统功能的时候&#xff0c;需要…

MyBatis讲解,批量添加

一、批量添加 1.书写BookMapper 1.1先在navicat的新建查询里书写条件查询的sql语句 条件查询的sql语句 insert into book(book_name) values(三体); 1.2将sql语句复制到BookMapper里 用到foreach标签&#xff1b; collection&#xff1a;可以放数组&#xff0c;也可以放list集…

数据结构与算法-算法分析(2)

算法和算法分析 对于同一个问题可能由不同的算法。究竟来如何评价这些算法 一个算法首先要具备正确性&#xff0c;健壮性&#xff0c;可读性和有穷性&#xff0c;然后我们再比较其算法的效率&#xff0c;来评判算法的优劣。 主要从时间和空间上的效率进行评价算法&#xff0c…

对JSON的理解

什么是JSON? JSON全名是JavaSpript Object Notation。 JSON是轻量级的文本数据交换格式。 JSON是存储和交换文本信息的语法&#xff0c;类似XML,比XML更小&#xff0c;更快&#xff0c;更易解析。 JSON可以将Java对象转换为特殊格式的字符串&#xff08;JSON串&#xff09…

矿井水深度除总氮

工艺原理 选择性去除硝酸盐氮 项目背景 近年来高矿化度和含特殊组分矿井水逐年增多&#xff0c;以及环保政策的趋严给矿井水处理带来新挑战。 随着《水污染防治行动计划》 &#xff08;水十 条&#xff09;的深入开展和新的煤矿环境影响评价制度的执行&#xff0c;山西、陕…