----转载

1.JDBC数据库连接池的必要性

在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:  

在主程序(如servlet、beans)中建立数据库连接。

进行sql操作

断开数据库连接。

这种模式开发,存在的问题:

普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。

这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃.

2.数据库连接池(connection pool)

为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

3.数据库连接池技术的优点

(1)资源重用:由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

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

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

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

4.c3p0数据库连接池

据说c3p0数据库连接池是最优秀的,下面我就来介绍如何使用c3p0连接池。

(1)下载jar包

(2)配置文件

作为一个数据库连接池自然有很多参数要设置,当然就算你不设置也有默认的,不过那不一定能满足你的要求。这里的配置文件没有什么特别的要求,可以是xml也可以是properties甚至与txt都行,当然如果你愿意也可以写死在程序中。

下面是我的配置文件,我把它放在了src目录下,名字叫“c3p0.properties”

#jdbc基本信息
driverClass=oracle.jdbc.driver.OracleDriver
jdbcUrl=jdbc:oracle:thin:@192.168.61.250:1521:SXPPMS
user=qzp
password=111111  #c3p0连接池信息
c3p0.minPoolSize=3
c3p0.maxPoolSize=25  #当连接池中的连接耗尽的时候c3p0一次同时获取的连接数
c3p0.acquireIncrement=3
#定义在从数据库获取新连接失败后重复尝试的次数
c3p0.acquireRetryAttempts=60
#两次连接中间隔时间,单位毫秒
c3p0.acquireRetryDelay=1000
#连接关闭时默认将所有未提交的操作回滚
c3p0.autoCommitOnClose=false
#当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒
c3p0.checkoutTimeout=3000
#每120秒检查所有连接池中的空闲连接。Default: 0
c3p0.idleConnectionTestPeriod=120
#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
c3p0.maxIdleTime=600
#如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
c3p0.testConnectionOnCheckin=true
#c3p0将建一张名为c3p0TestTable的空表,并使用其自带的查询语句进行测试。
jdbc.automaticTestTable = c3p0TestTable

  创建一个Utile类工具,专门负责处理数据库连接:

 //初始化连接池private static DataSource dataSource;static{dataSource = new ComboPooledDataSource();}public static DataSource getDataSource(){return dataSource;}//   public static DataSource getDataSource(DataSource dataSource){
//      dataSource = new ComboPooledDataSource();
//      return dataSource;
//  }/*** 创建DbUtils常用工具类对象*/public static QueryRunner getQueryRunner(){return new QueryRunner(dataSource); }

  再在DAO层进行层删改查进行封装。

PS:学习小结

1.连接池的好处是不必每次连接都新建一个连接,可以直接取池中取,节约内存资源;

2.使用配置文件,代替原来的jdbc硬编码的形式,复用性更强,而且可以在其中配置连接池的相关信息

3.获取当前路径下的文件,可以使用

Properties c3p0Pro = new Properties();
            //加载配置文件,注意此处是以流的形式返回,C3P0ConnentionProvider是类名
            c3p0Pro.load(C3P0ConnentionProvider.class.getResourceAsStream("/c3p0.properties"));

4.刚开始的时候,不是很深刻理解arraylist的操作,注意直接打印输出arraylist的值,它只会返回他所在的包及路径,如果要取到其中的值,必须遍历

转载于:https://www.cnblogs.com/tangdrogn/p/8177754.html

数据库连接池的作用及c3p0的详解(转载他人的--合理掌握学习方式)相关推荐

  1. 数据库连接池的作用及c3p0的详解

    1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模 ...

  2. Java数据库连接池知识汇总(C3P0+DBCP+Druid)

    为什么要使用数据库连接池技术? 数据库连接池技术的优点 1. 资源重用 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性 ...

  3. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  4. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  5. 异步FIFO设计:各个模块的作用及Verilog代码详解

    实现原理参考:异步FIFO---Verilog实现_alangaixiaoxiao的博客-CSDN博客_异步fifo 代码参考:IC基础(一):异步FIFO_MaoChuangAn的博客-CSDN博客 ...

  6. 荒岛求生html5母狼攻,荒岛求生各资源作用及获取方法详解

    荒岛求生各资源作用及获取方法详解 2018-03-06 13:45:22来源:游戏下载编辑:野狐禅评论(0) 荒岛求生地图中有很多资源可以获取,它们各有什么作用呢?下面就为大家带来荒岛求生资源作用及获 ...

  7. linux中umask的原理和作用,Linux 的umask详解

    1.由权限得到umask的值 umask是一个系统变量,是一个由3个八进制数字组成的值,具体含义见表:每个数字都是八进制值1.2.4的OR操作结果. 作用:当文件被创建时,为文件的访问权限设定一个掩码 ...

  8. android 自定义xmlns,Android xmlns 的作用及其自定义实例详解

    Android xmlns 的作用及其自定义实例详解 xmlns:Android="http://schemas.android.com/apk/res/android的作用是: 这个是xm ...

  9. 双冒号作用运算符以及命名空间详解

    转载地址:双冒号作用运算符以及命名空间详解,你确定不来看看吗?_敲键盘的喵的博客-CSDN博客 一.双冒号作用域运算符 通常情况下,如果程序中即存在局部变量又存在全局变量,局部变量将会获得较高的优先权 ...

最新文章

  1. 使用UIScrollView 实现分页功能
  2. linux命令head
  3. windows10配置php7.1+apache2.4+mysql5.7
  4. C++ COM编程之什么是组件
  5. struts2_模型驱动
  6. Solr的学习使用之(三)IKAnalyzer中文分词器的配置
  7. ipv6远程连接mysql_如何利用IPv6进行远程桌面连接
  8. css之背景图固定大小不变、不重复、充满整个页面
  9. TSS ESS RSS
  10. DS1302时钟模块通信原理(SPI总线)
  11. MyBatis最新官方下载地址
  12. linux五笔输入法制作_五笔98输入法制做--for Linux ibus
  13. [4G5G专题-81]:流程 - 4G LTE 小区切换流程大全
  14. 服务器虚拟化集群部署
  15. sas html5,什么是sas?
  16. bandgap的理解(内部带隙电压基准)
  17. KBP410-ASEMI开关电源整流器件KBP410
  18. Axure RP 从入门到精通(四十二)案例 - 淘宝搜索框
  19. 幼儿园小朋友们的难题
  20. 无线打印服务器华硕,华硕远程打印服务器

热门文章

  1. Hibernate--Criteria Query and DetachedCriteria
  2. python中的下划线用法
  3. F5解决方案– 教育行业解决方案1(分析篇)
  4. QOS之NBAR 下
  5. Web后端学习笔记 Flask(6)数据库
  6. Layer 2 DAO 基础协议 Metis 上线 Alpha 测试网
  7. Kaggle 数据清洗挑战 Day 4 - 字符编码(Character Encoding)处理
  8. 美丽的字符正方形FINAL
  9. MySql中左连接查询突然变得很慢
  10. Centos7查看网络配置