(一)问题的提出:

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

  1. 在程序中建立数据库连接
  2. 进行sql操作
  3. 断开数据库连接

但是,这种模式存在着移动的问题:

  • 传统连接模式每次向数据库建立连接的时候都将Connection加载到内存,验证用户名密码(该过程花费时间),然后再操作数据库,断开连接。当频繁的进行这些操作时会消耗大量的资源和时间。数据库的连接资源并没有很好的重复利用。
  • 对于每一次数据库的连接,使用完都需要断开,如果出现异常导致连接没能正常关闭,则可能会导致数据库系统中的内存泄漏,最终导致重启数据库和服务器;
  • 传统模式不能控制被创建的连接对象数目,系统资源被毫无顾忌的分配,导致内存泄漏 服务器崩溃。

(二)数据库连接池技术:

基本思想

  • 连接池基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
  • 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
  • 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

连接池优点

  • 资源重用:由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
  • 更快的系统反应速度:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间
  • 新的资源分配手段:对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源
  • 统一的连接管理,避免数据库连接泄露:在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露

(三)c3p0数据库连接池

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

c3p0使用xml文件进行相关的配置:

 <?xml version="1.0" encoding="UTF-8"?>
<c3p0-config destroy-method="close">
<!-- 这是默认配置信息 -->
<default-config destroy-method="close">
<!-- 连接四大参数配置 -->
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mask_db?useSSL=false</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 池参数配置 -->
<!--连接池中保留的最小连接数。 -->
<property name="minPoolSize" value="5" />
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="500" />
<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="10" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="60" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="5" />
<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 -->
<property name="maxStatements" value="0" />
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="60" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="30" />
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
<property name="breakAfterAcquireFailure" value="false" />
<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false -->
<property name="testConnectionOnCheckout" value="false" />
<!--连接池用完时客户调用getConnection()后等待获取连接的时间,单位:毫秒。超时后会抛出 -->
<!--SQLEXCEPTION,如果设置0,则无限等待。Default:0 -->
<property name="checkoutTimeout" value="100" /> <property name="verifyServerCertificate" value="false" /> </default-config> <!-- 专门为oracle提供的配置信息 -->
<named-config name="oracle-config">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mask_db</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</named-config> </c3p0-config>

 代码测试:

 package sql.mysql;

 import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test; import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException; /**
* Created by :Infaraway
* DATE : 2017/3/6
* Time : 15:10
* Funtion : 测试C3P0连接池技术
*/
public class c3p0Test { private static DataSource dataSource = null;
static {
dataSource = new ComboPooledDataSource("testc3p0");
} public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
@Test
public void testC3P0() throws SQLException {
Connection connection = getConnection();
System.out.println(connection);
} }

数据库连接池(c3p0)的更多相关文章

  1. 数据库连接JDBC和数据库连接池C3P0自定义的java封装类

    数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...

  2. 数据库连接池 c3p0 druid

    druid 数据库连接池 c3p0 使用C3P0数据源时需要依赖 mchange-commons-java-0.2.3.4.jar包.缺少该jar包则会报错!

  3. 数据库连接池——C3P0&Druid(快速入门)

    数据库连接池--C3P0&Druid (一) 数据库连接池 每一个事物都有其存在的意义,在初学jdbc的时候,我们建立数据库连接对象后,会对其进行释放,但是数据库连接的建立和关闭是非常消耗资源 ...

  4. 数据库连接池c3p0学习

    这里只记录c3p0的数据源,不会涉及到其它方面和别的数据库连接池的对比 配置文件主要的实现方式有三种: 1.手写代码去加载一个配置文件 创建一个config.properties文件如下: drive ...

  5. [数据库连接池二]Java数据库连接池--C3P0和JDNI.

    前言:上一篇文章中讲了DBCP的用法以及实现原理, 这一篇再来说下C3P0和JDNI的用法. 1.1.C3P0数据源 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规 ...

  6. 数据库连接池 c3p0 demo 代码和分析

    import java.sql.Connection; import java.sql.SQLException; import java.beans.PropertyVetoException; i ...

  7. 数据库连接池c3p0和dbcp

    现在常用的开源数据连接池主要有c3p0.dbcp和proxool三种,其中: hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样 ...

  8. 数据库连接池 C3p0

    数据库连接池 C3po 1 定义 本质上是个容器(集合) 存放数据库的连接容器(connection 对象) ,当系统初始化以后 容器就会创建 容器中就会申请一些连接对象 ,当用户来访问数据库的时候 ...

  9. java学习笔记41(数据库连接池 C3p0连接池)

    在之前的学习中,我们发现,我们需要频繁的创建连接对象,用完之后还需要在关闭资源,因为这些连接对象都是占资源的,但是又不得不创建,比较繁琐,为了解决这种情况,Java出现了数据库连接池: 数据库连接池的 ...

  10. JAVA数据库连接池C3p0 以及阿里Druid提供的连接池

    一:连接池的定义 本质上就是个容器(集合) 存放数据库连接的容器,当系统初始化后,容器被创建,容器中就会申请一些连接对象,当用户来访问数据库的时候,从容器中取连接对象,用户用完之后,归还. 二:常用的 ...

随机推荐

  1. Python的变量和常量

    解释器执行Python的过程:   (python3,c:/test.py) 1:启动python解释器(内存中). 2:将c:/test.py内容从硬盘读到内存中(这一步和文本编辑器是一样的). 3 ...

  2. 在File Explorer的当前路径上直接打开VS Code

    在C:\windows\system32文件下创建code.bat文件, 内容如下: @echo offstart "" "%ProgramFiles(x86)%\Mic ...

  3. g4e基础篇#3 Git安装与配置

    g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索. 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git ...

  4. 【读书笔记与思考】《python数据分析与挖掘实战》-张良均

    [读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...

  5. 架构师之路->架构师思维的培养

    公司的CMS(综合赋码管理系统)是WINFORM的CS架构.这套系统的架构师换了3届,到现在已经几年没有架构师了.本来入职时,岗位目标就是这个“自动化架构师”. 后来和领导达成共识先争取成为储备架构师 ...

  6. SAP的这三款CRM解决方案,您能区分清楚么

    我的一位同事, John Burton, 在2017年12月底写过一篇博文:Explaining SAP's portfolio of "CRM Service" related ...

  7. 错误:'dict' object is not callable

    在晚上学习别人的代码,偶然爆出错误:'dict' object is not callable 找了半天没发现错误.后来还想上文已经有变量名为dict. 因此dict在下面程序中被认为是一个变量不是内 ...

  8. 【转】如何将qlv格式的腾讯视频转换为mp4格式

    一般来说,每个视频网站都会有自己的视频播放格式,如优酷的KUX.爱奇艺的QSV和腾讯的QLV等.但是大家知道,优酷是有转码功能的,而就目前来说腾讯视频还没有转码功能,这就给大家造成了一定的困扰.这里呢 ...

  9. [PHP] PHP与Apache的模块配合说明

    1.当PHP需要在Apache服务器下运行时 一般来说,它可以mod_php5模块的形式集成, 此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求, 然后将处理后 ...

  10. java_web学习(十一) 层的概念与应用

    一个项目通常分为三层: 所谓三层是表述层(WEB层).业务逻辑层(Business Logic),以及数据访问层(Data Access). ·WEB层:包含JSP和Servlet等与WEB相关的内容 ...