一、C3P0的施用手续

C3PO数据库连接池

亮点:质量比较dbcp好,稳固性也比dbcp强

**参数介绍
**

Ø BasicDataSource 相关的参数表明

dataSource: 要连接的 datasource (经常大家不会定义在 server.xml)

defaultAutoCommit: 对于事情是否 autoCommit, 暗许值为 true

defaultReadOnly: 对于数据库是还是不是只好读取, 默许值为 false

driverClassName:连接数据库所用的 JDBC Driver Class,

maxActive: 能够从目的池中收取的目的最大个数,为0则意味着并未有限制,暗中认可为8

maxIdle: 最大等待连接中的数量,设 0 为未有限制 (对象池中目的最大个数)

minIdle:对象池中指标最小个数

maxWait: 最大等待秒数, 单位为 ms, 超越时间会丢出错误新闻

password: 登入数据库所用的密码

url: 连接数据库的 UPRADOL

username: 登入数据库所用的帐号

validationQuery: 验证连接是不是中标, SQL SELECT 指令至少要重回一行

removeAbandoned: 是还是不是本身中断, 暗中同意是 false

removeAbandonedTimeout: 几秒后会自己中断, removeAbandoned 必需为 true

logAbandoned: 是还是不是记录中断事件, 暗中同意为 false

minEvictableIdleTimeMillis:大于0
,进行三番五次空闲时间剖断,或为0,对空闲的一连不实行验证;默许30分钟

timeBetweenEvictionRunsMillis:失效检查线程运维时刻距离,假若低于等于0,不会运转物检疫查线程,暗中认可-1

testOnBorrow:获得对象时是还是不是举行验证,检核对象是还是不是有效,默认为false

testOnReturn:重临对象时是还是不是进行表达,检核对象是或不是可行,默感到false

testWhileIdle:空闲时是或不是实行认证,检核对象是还是不是管用,私下认可为false

Ø
在运用DBCP的时候,借使选用默许值,则数据库连接因为某种原因断掉后,再从连接池中收获三番五次又不进行验证,那时获得的接连实际上就能是不行的数据库连接。由此为了幸免获得的数据库连接失效,在行使的时候最棒确认保证:

username: 登入数据库所用的帐号

validationQuery:SELECT COUNT(*) FROM DUAL

testOnBorrow、testOnReturn、testWhileIdle:最棒都设为true

minEvictableIdleTimeMillis:大于0
,进行三番五次空闲时间判断,或为0,对空闲的连接不进行验证

timeBetweenEvictionRunsMillis:失效检查线程运维时刻距离,若是低于等于0,不会运维物检疫查线程

Ø PS:在构造GenericObjectPool [BasicDataSource在其createDataSource ()
方法中也会选用GenericObjectPool]
时,会转移叁个内嵌类Evictor,完毕自Runnable接口。假诺timeBetweenEvictionRunsMillis大于0,每过
timeBetweenEvictionRunsMillis微秒Evictor会调用evict()方法,检核对象的闲置时间是还是不是高出minEvictableIdle提姆eMillis皮秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默以为30分钟),是则销毁此指标,否则就激活并校验对象,然后调用ensureMinIdle方法检查确定保证池中指标个数不低于_minIdle。在调用
returnObject方法把指标放回对象池,首先检查该指标是不是有效,然后调用PoolableObjectFactory
的passivateObject方法使对象处于非活动状态。再检核查象池中指标个数是还是不是低于maxIdle,是则能够把此指标放回对象池,不然销毁此对

因不想承接在PHP花越多的年月,所以动手JAVA,从零学至此利用C3P0达成JDBC连接池,升高数据库管理的力量,加速品质。一般情状下,操作数据库的经过都是三番五次数据库->试行操作->释放财富。那样的操作在相似情状下是没什么难点的,不过一旦出现多次的操作就能够促成一些品质上的难点,因为每每打开关闭连接是个耗时的操作,所以就Java最近用得最多的是C3P0完成JDBC连接池,由于刚先生动手Java希望各位小同伙海涵。

一、c3p0简介:

数据库连接池的主干考虑正是为数据库连接组建三个“缓冲池”。预先在缓冲池中归入一定数额的接连,当必要创立数据库连接时,只需从“缓冲池”中抽出叁个,使用完成之后再放回去。我们能够透过设定连接池最达累斯萨Lamb接数来防守系统成千上万的与数据库连接。

赢得贰个连连,系统要在私自做过多消耗财富的事体,好些个时候,创造连接的年月比进行sql语句的小时还要长。
顾客每一趟须求都急需向数据库得到链接,而数据库创制连接通常供给花费相对一点都不小的财富,创立时间也较长。

数据库连接池担负分配,管理和自由数据库连接,它同意应用程序重复使用八个存世的数据库连接,并不是再一次创立叁个。

c3p0是贰个开源的JDBC连接池,它完成了数据源和JNDI绑定,协助JDBC3规范和JDBC2的正规化扩充。c3p0一般是与Hibernate,Spring等框架一块使用的,当然也足以独立采用。
dbcp未有自动回收空闲连接的意义,c3p0有机关回收空闲连接功效。

C3P0连接池:

1:导入相关的注重jar包

  c3p0-0.9.5.2.jar
  mchange-commons-java-0.2.12.jar

TransactionManager

事务

三个行使
MyBatis-spring的重大缘由是它同意
MyBatis 加入到 Spring 的事务管理中。而 不是给 MyBatis
创设多少个新的一定的事体处理器,MyBatis-Spring 利用了留存于 Spring 中的
DataSourceTransactionManager。

假若 Spring 的 PlatformTransactionManager 配置好了,你能够在 Spring
中以你平时的做 法来配置事务。@Transactional 注脚和 AOP(Aspect-Oriented
Program,面向切面编制程序,译
者注)样式的配置都以支撑的。在事务处理时期,一个独门的 SqlSession
对象将会被创造 和平运动用。当事情达成时,这么些 session
会以万分的法门交给或回滚。

借使事情创立之后,MyBatis-Spring 将会透明的管住作业。在您的 DAO
类中就无需额 外的代码了。

规范配置

要 开 启 Spring 的 事 务 处 理 , 在 Spring 的 XML 配 置 文 件 中 简 单
创 建 一 个 DataSourceTransactionManager 对象:

钦点的 DataSource 一般能够是你利用 Spring 的专擅 JDBC
DataSource。那包含了连年 池和由此 JNDI 查找获得的 DataSource。

要专心, 为作业管理器钦定的 DataSource 必须和用来创建SqlSessionFactoryBean 的 是同多个数据源,不然事务管理器就不能够专门的学业了。

容器处监护人务

万一您正利用三个 JEE 容器何况想让 Spring
加入到容器管理作业(Containermanaged
transactions,CMT,译者注)中,那么 Spring 应该利用 JtaTransactionManager
或它的容 器钦命的子类来布置。做那件事情的最有益的艺术是用 Spring
的事务命名空间:

在这种布署中,MyBatis 将会和别的由 CMT 配置的 Spring 事务财富同样。Spring
会自动 使用狂妄存在的器皿事务,在地点附加一个SqlSession。若无起来工作,大概必要基 于事情配置,Spring
会开启八个新的容器处总管务。

注 意 , 如 果 你 想 使 用 CMT , 而 不 想 使 用 Spring 的 事 务 管 理 ,
你 就 必 须 配 置 SqlSessionFactoryBean 来利用基本的 MyBatis 的
ManagedTransactionFactory 并非其 它自便的 Spring 事务管理器:

编制程序式事务管理

MyBatis 的 SqlSession 提供内定的主意来管理编制程序式的作业。 可是当使用
MyBatis-Spring 时, bean 将会选拔 Spring 管理的 SqlSession
或映射器来注入。 那就是说 Spring 平日是管理 事务的。

你 不 能 在 Spring 管 理 的 SqlSession 上 调 用 SqlSession.commit() ,
SqlSession.rollback() 或 SqlSession.close() 方 法 。 如 果 那 样 做 了 ,
就 会 抛 出 UnsupportedOperationException
万分。注意在选用注入的映射器时无法访问那贰个方法。

无论是 JDBC 连接是或不是设置为机关提交, SqlSession 数据方式的实践或在 Spring
事务之外 任性调用映射器方法都将会自行被交给。

动用C3P0先得引包:c3p0-0.9.1.2.jar和mysql-connector-java-5.1.39-bin.jar

二、c3p0的使用和安插:

导入jar文件:前2个是c3p0的jar包,后一个是jdbc的jar包

 

图片 1

 

安排:在src下建立一个xml文件,命名叫c3p0-config.xml  
命名不可能改其余的,不然找不到

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>    
        <default-config>    
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>    <!-- jdbc协议地址 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>             <!-- 驱动 -->
            <property name="user">root</property>                                     <!-- 数据库的用户名  -->
            <property name="password"></property>                                     <!-- 数据库密码 ,若没有密码,该项可省略 -->

      <!--***** *************************以下property 配置可不写, 有默认值***************************************** -->

            <property name="initialPoolSize">10</property>                    <!-- 初始化时的链接数量 -->
            <property name="maxPoolSize">100</property>                        <!-- 最大链接数量 -->
            <property name="minPoolSize">10</property>                        <!-- 最小链接数量  -->

            <!--当连接池中的连接耗尽的时候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>    

    <!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.    
    (文档原文)作者强烈建议不使用的一个属性-->    
    <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>  

        </default-config>    
    </c3p0-config>

 

 

成功上述配置,我们来构造建设三个类Test
 来测量检验一下,在选拔c3p0的气象下和不应用的气象下,毕竟效能差了有一些

package com.maya.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Calendar;
import com.mchange.v2.c3p0.ComboPooledDataSource;



public class Test {

    //使用jdbc方式链接
    public static void main111(String[] args) throws Exception {        
        long x=Calendar.getInstance().getTimeInMillis();        //获取链接之前,的时间

        for(int i=0;i<1000;i++){
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","");
            conn.close();                //这里也是打开一次之后就关闭一次
        }
        long y=Calendar.getInstance().getTimeInMillis();
        System.out.println("jdbc链接方式需要的时间是  "+(y-x));        //最后打印一下完成整个循环所需要的时间      

    }

    //使用c3p0连接池
    public static void main(String[] args) throws Exception {
        long x=Calendar.getInstance().getTimeInMillis();    //获取链接之前,的时间

        ComboPooledDataSource ds=new ComboPooledDataSource();    //读取xml文件的配置

        for(int i=0;i<1000;i++){                            //循环1000次,即打开链接,关闭链接1000次
            Connection conn=ds.getConnection();
            conn.close();
        }
        long y=Calendar.getInstance().getTimeInMillis();    //循环完成后的时间
        System.out.println("c3p0连接池需要的时间是:  "+(y-x));                            //最后打印一下完成整个循环所需要的时间      

    }

}

此间因为未有导入junit  
 jar包,小编直接写了一个main函数来测验获得的结果如下:

图片 2

图片 3

很令人瞩目,在功用方面,小胜。

 

Hibernate框架中,使用连接池:

在hibernate框架中,使用链接池的机能,实际不是特意的明显,全体来讲,成效并不曾过多的升高,步骤同上,导入jar包,hibernate须求额外三个jar包,在hibernate/lib/optional/c3p0文件夹下
   找到hibernate-c3p0-5.2.6.final.jar文件

图片 4

 

布置时,需求在hibernate.cfg.xml文件中配备

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
            <!--c3p0需要的配置 -->
        <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
        <property name="hibernate.c3p0.min_size">1</property>
        <property name="hibernate.c3p0.max_size">10</property>

        <!--  以下是hibernate框架的配置    -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>

        <mapping resource="com/itnba/maya/entities/Family.hbm.xml"/>
        <mapping resource="com/itnba/maya/entities/Info.hbm.xml"/>
        <mapping resource="com/itnba/maya/entities/Work.hbm.xml"/>
        <mapping resource="com/itnba/maya/entities/Nation.hbm.xml"/>
        <mapping resource="com/itnba/maya/entities/Title.hbm.xml"/>

    </session-factory>
</hibernate-configuration>

 

做四个测验类,测验一下成效

package com.itnba.maya.test;

import java.util.Calendar;
import java.util.List;

import org.hibernate.Session;

import com.itnba.maya.entities.Info;

public class TestHibernate {

    public static void main(String[] args) {

        long start = Calendar.getInstance().getTimeInMillis();    //读取开始执行时的时间

        for(int i=0;i<1000;i++){
            Session session = HibernateUtil.getSession();
            List<Info> list = session.createQuery("from Info").getResultList();
            for(Info data:list){
                System.out.println(data);
            }
            HibernateUtil.closeSession();
        }
        long end = Calendar.getInstance().getTimeInMillis();//读取结束执行时的时间

        System.out.println(end-start);                        //打印执行期间所花的时间

    }

}

聊到底开采,hibernate中,加和不加,差异并不是广大,因为在hibernate中,session会话要确定保障险单例方式。

 

spring中什么行使c3p0呢?

同上,导包,c3p0的jar包,别的还亟需的是spring的jar包

配备:有二种艺术,一种是运用properties系统文件配置,一种是spring配置文件配置

 

1.spring配备文件:

在src下建构bean.xml    bean那几个名字能够用任何的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <!--  c3p0的配置 -->
    <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="combo">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK"></property>
        <property name="user" value="root"></property>
        <property name="password" value=""></property>
        <property name="minPoolSize" value="3"></property>
        <property name="maxPoolSize" value="20"></property>
    </bean>

</beans>

 

 

建贰个测量检验类test测量试验一下配备是或不是成功

package com.maya.test;

import java.sql.Connection;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class Test {



    public static void main(String[] args) throws Exception{

        ApplicationContext app= new ClassPathXmlApplicationContext("beans.xml");    //读取配置

        ComboPooledDataSource ds=(ComboPooledDataSource)app.getBean("combo");        //获取id为combo的的配置

        Connection conn=ds.getConnection();                        //转换成 java.sql.Connection

        System.out.println(conn.isClosed());        //最后打印一下,看看链接是否是关闭状态,false为未关闭,即打开
        conn.close();

    }

}

图片 5   
 表示,链接打开了,配置达成

 

第三种艺术

  properties系统文件配置

  建构叁个db.properties 系统文件

driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/mydb?characterEncoding=GBK
user=root
password=

minPoolSize=5
maxPoolSize=15
initialPoolSize=5

然后在spring配置文件中,

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!--  获取系统文件中的数据-->
    <context:property-placeholder location="classpath:db.properties"/>
        <!-- 用EL表达式获取系统文件中的属性-->
    <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="combo">
        <property name="driverClass" value="${driverClass}"></property>
        <property name="jdbcUrl" value="${jdbcUrl}"></property>
        <property name="user" value="${user}"></property>
        <property name="password" value="${password}"></property>

        <property name="minPoolSize" value="${minPoolSize}"></property>
        <property name="maxPoolSize" value="${maxPoolSize}"></property>
        <property name="initialPoolSize" value="${initialPoolSize}"></property>
    </bean>

</beans>

 

测验结果,同上图片 5

安插文件:c3p0-config.xml

2:代码实现

  • ### A:硬编码的完成方式

图片 7图片 8

package com.dreambamboo.test;import com.mchange.v2.c3p0.ComboPooledDataSource;import javax.lang.model.element.NestingKind;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class C3P0Test {    public static void main(String[] args) {        try {            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();            comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");            comboPooledDataSource.setUser("root");            comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");            comboPooledDataSource.setPassword("mysql");            Connection connection = comboPooledDataSource.getConnection();            Statement statement = connection.createStatement();            String sql = "select * from student where id = 2";            ResultSet rs = statement.executeQuery;            if ){                System.out.println(rs.getInt("id") + "==============>" + rs.getString("name"));            }        } catch (SQLException e) {            e.printStackTrace();        } catch (PropertyVetoException e) {            e.printStackTrace();        }    }}

View Code

图片 9

  • ### B:软编码完成情势

    • #### a:借助c3p0工具类完成

      • #### c3p0工具类

图片 10图片 11

package com.dreambamboo.utils;import com.mchange.v2.c3p0.ComboPooledDataSource;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class C3P0Utils {    private static  final ComboPooledDataSource DATA_SOURCE = new ComboPooledDataSource("dumbTestConfig");    private static Connection connection = null;    /**     * 获取数据库连接connection     * @return     */    public static Connection getConnection(){        try {            connection = DATA_SOURCE.getConnection();        } catch (SQLException e) {            e.printStackTrace();        }        return connection;    }    /**     * 释放资源     * @param connection     * @param statement     * @param resultSet     */    public void release(Connection connection, Statement statement, ResultSet resultSet){        try {            if (connection != null) {                connection.close();            }            if (statement != null) {                statement.close();            }            if (resultSet != null) {                resultSet.close();            }        } catch (SQLException e) {            e.printStackTrace();        }    }}

View Code

      • #### 测量检验代码

图片 12图片 13

package com.dreambamboo.test;import com.dreambamboo.utils.C3P0Utils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class Test03 {    public static void main(String[] args) {        Connection connection = C3P0Utils.getConnection();        try {            Statement statement = connection.createStatement();            String sql = "select * from student";            ResultSet resultSet = statement.executeQuery;            while (resultSet.next{                System.out.println(resultSet.getInt("id") + "===========>>>>>>>" + resultSet.getString("name"));            }        } catch (SQLException e) {            e.printStackTrace();        }    }}

View Code

      • #### 运营作效果果

图片 14

    • #### b:借助c3p0布署文件贯彻

      • #### c3p0安排文件(轻松版本只安顿数据源)

图片 15图片 16

<?xml version="1.0" encoding="UTF-8" ?><c3p0-config>    <named-config name="dumbTestConfig">        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>        <property name="user">root</property>        <property name="driverClass">com.mysql.jdbc.Driver</property>        <property name="password">mysql</property>    </named-config></c3p0-config>

View Code

      • #### 测验代码

图片 17图片 18

package com.dreambamboo.test;import com.mchange.v2.c3p0.ComboPooledDataSource;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class C3P0ConfigTest {    public static void main(String[] args) {        //dumbTestConfig为配置文件中的<named-config name="dumbTestConfig">的name的值        ComboPooledDataSource dataSource = new ComboPooledDataSource("dumbTestConfig");        try {            Connection connection = dataSource.getConnection();            Statement statement = connection.createStatement();            String sql = "select * from student";            ResultSet resultSet = statement.executeQuery;            while (resultSet.next{                System.out.println(resultSet.getInt("id") + "==============>>>>>>>>>>" + resultSet.getString("name"));            }        } catch (SQLException e) {            e.printStackTrace();        }    }}

View Code

      • #### 运营作效果果

图片 19

编写C3P0布置文件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:///mybase</property>
        <property name="user">root</property>
        <property name="password">xuyiqing</property>
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>

    <named-config name="yiqing">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///mybase</property>
        <property name="user">root</property>
        <property name="password">xuyiqing</property>
    </named-config>


</c3p0-config>

二、C3P0配置详解

<?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/test20180109</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>
    <named-config name="lfriend">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///test20180109</property>
        <property name="user">root</property>
        <property name="password">root</property>
    </named-config>
</c3p0-config>

  测试:

1、数据源的配置

参数 默认值 说明
driverClass 数据库驱动
jdbcUrl jdbc数据库连接地址
user 数据库用户名
password 登陆数据库的密码

编写c3p0工具类

数量计划:

    常用的数据库驱动简单介绍

      A:Oracle

      • 驱动:oracle.jdbc.driver.OracleDriver
      • url:jdbc:oracle:thin:@dbip:port:databasename
        • url各部分的意义
          • dbip–为数据库服务器的IP地址,尽管是本地可写:localhost或127.0.0.1。
          • port–为数据库的监听端口,要求看安装时的配备,缺省为1521。
          • databasename–为数据库的SID,常常为全局数据库的名字。            

      B:MySQL

      • 驱动:com.mysql.jdbc.Driver
      • url:jdbc:mysql://dbip:port/databasename
        • url各部分的含义
          • dbip–为数据库服务器的IP地址,假如是地面可写:localhost或127.0.0.1。
          • port–为数据库的监听端口,须要看安装时的布置,缺省为3306。
          • databasename–为数据库的SID,常常为大局数据库的名字。 

      C:SQLServer

      • 驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver
      • url:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename
        • url各部分的意义
          • dbip–为数据库服务器的IP地址,借使是本地可写:localhost或127.0.0.1。
          • port–为数据库的监听端口,需求看安装时的安顿,缺省为1433。
          • databasename–为数据库的SID,常常为全局数据库的名字。 
package me.lfriend.jdbc.utils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Utils {
    private static ComboPooledDataSource dataSource=new ComboPooledDataSource('lfriend');
    public static DataSource getDataSource(){
        return dataSource;
    }
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

图片 20图片 21

2、连接池的根基配置

参数 默认值 说明
initialPoolSize 3 连接池初始化时创建的连接数(结余maxPoolSize和minPoolSize之间)
maxPoolSize 15 连接池中拥有的最大连接数,如果获得新连接时会是连接总数超过这个值则不会在获取新的连接,而是等待其他连接释放,所以这个值可能会设置很大
minPoolSize 3 连接池保持的最小连接数,后面的maxIdeTimeExcessConnections跟这个配合使用来减轻连接池的负载
acquireIncrement 3 连接池在无空闲连接时一次性创建的新数据库连接数

编写制定测量检验类TestC3P0.java

CREATE DATABASE mybase;
USE mybase;
CREATE TABLE users(
uid INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(64),
upassword VARCHAR(64)
);
INSERT INTO users (username,upassword) VALUES("zhangsan","123"),("lisi","456"),("wangwu","789");
SELECT * FROM users;

3、管理池大小和连接时间的安顿

参数 默认值 说明
maxIdleTime 0 不会断开连接
maxConnectorAge 0 连接的最大最对年龄,单位是秒,0表示绝对年龄无限大
maxIdleTimeExcessConnection 0 单位秒,为了减轻连接池的负载,当连接池经过数据访问高峰创建了很多连接,但是后面的连接池不需要维护这么多连接,必须小于maxIdleTime。配置不为0,则将连接吃的数量保持到minPoolSize
package me.lfriend.jdbc.test;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import me.lfriend.jdbc.utils.C3P0Utils;
import me.lfriend.jdbc.utils.JDBCUtils_V3;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;

public class TestC3P0 {

    @Test
    public void testAddUser(){
        Connection conn=null;
        PreparedStatement pstmp=null;
        //1.创建自定义连接池对象
        ComboPooledDataSource dataSource=new ComboPooledDataSource();//加载默认配置
        //ComboPooledDataSource dataSource=new ComboPooledDataSource("lfriend");//加载有名称的配置

        try {
            //2.从池子中获取连接
            conn=dataSource.getConnection();
            //3.编写sql
            String sql="insert into user values(null,?,?)";
            //4.创建预处理对象
            pstmp=conn.prepareStatement(sql);
            //5.设置参数
            pstmp.setString(1,"piu");
            pstmp.setString(2,"123456");
            //6.执行查询
            int row=pstmp.executeUpdate();
            if(row>0){
                System.out.println("添加成功!");
            }else{
                System.out.println("添加失败!");
            }
        }catch (Exception e){
            throw new RuntimeException(e);
        }finally {
            JDBCUtils_V3.release(conn,pstmp,null);
        }
    }

    /**
     * 工具类使用C3P0
     */
    @Test
    public void testAddUser1(){
        Connection conn=null;
        PreparedStatement pstmp=null;
        try {
            conn= C3P0Utils.getConnection();
            //3.编写sql
            String sql="insert into user values(null,?,?)";
            //4.创建预处理对象
            pstmp=conn.prepareStatement(sql);
            //5.设置参数
            pstmp.setString(1,"piu");
            pstmp.setString(2,"123456");
            //6.执行查询
            int row=pstmp.executeUpdate();
            if(row>0){
                System.out.println("添加成功!");
            }else{
                System.out.println("添加失败!");
            }
        }catch (Exception e){
            throw new RuntimeException(e);
        }finally {
            JDBCUtils_V3.release(conn,pstmp,null);
        }
    }
}

View Code

4、配置连接测量检验

参数 默认值 说明
automaticTestTable null 如果不为null,c3p0姜程程指定名称的空表,使用该表来测试连接 。
connectionTesterClassName com.mchange.v2.c3p0.impl.DefaultConnectionTester 通过实现ConnectionTester或QueryConnectionTester的类来测试连接,类名需指定全路径
idleConnectinoTestPeriod 0 每隔几秒检查所有连接池中的空闲连接
preferredTestQuery null 定义所有连接测试都执行的测试语句,在使用连接测试的情况下这个会显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在
testConnectionOnCheckin false 如果设为true那么在取得连接的同时将校验连接的有效性
testConnectionOnCheckout false 如果为true,在连接释放的同时将校验连接的有效性

    在那多少个参数中,idleConnectionTestPeriod、testConnectionOnCheckout和testConnectionOnCheckin调整哪天总是将被校验检测,automaticTestTable、connectionTesterClassName、和preferedTestQuery调控连接将怎么着被检验。

C3P0的基本操作便是那样,接待各位大佬建议难点!

自定义的JDBC工具类:

5、语句池的配置

参数 默认值 说明
maxStatements 0 JDBC的标准参数,用以控制数据源内健在的PreparedStatements数量
maxStatementsPerConnection 0 maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数
statementCacheNumDeferredCloseThreads 0 如果大于零,则语句池将延迟物理close()缓存语句直到其父连接未被任何客户端使用,或者在其内部由池本身使用
package demo;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

public class JDBCUtils3 {
    public static String driver;
    public static String url;
    public static String username;
    public static String password;

    static {
        try {
            ClassLoader classLoader = JDBCUtils3.class.getClassLoader();
            InputStream is = classLoader.getResourceAsStream("db.properties");
            Properties props = new Properties();
            props.load(is);
            driver = props.getProperty("driver");
            url = props.getProperty("url");
            username = props.getProperty("username");
            password = props.getProperty("password");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return conn;
    }

    public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

6、数据库中断复苏的安顿

参数 默认值 说明
acquireRetryAttempts 30 定义在从数据库获取新连接失败后重复尝试的次数
acquireRetryDelay 1000 两次连接间隔时间,单位毫秒
breakAfterAcquireFailure false 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接,如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭

  配置文件:

7、未缓慢解决的事务处理的配置

参数 默认值 说明
autoCommitOnClose false 连接关闭时默认将所有未提交的操作回滚,如果为true,则未提交设置为待提交而不是回滚
forceIgnoreUnresolvedTransactions false 官方文档建议不要设置为true
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybase
username=root
password=xuyiqing

8、别的数据源配置

参数 默认值 说明
checkoutTimeout 0 当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如果设置为0,则无限期等待,单位毫秒
factoryClassLocation 0

指定c3p0 libraries的路径,如果在本地即可获得,无需设置,默认null即可

numHelperThreads 3

c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成,扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。

  测试类:

三、C3P0的事无巨细布署介绍

图片 22图片 23

<c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候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> <!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. 作者强烈建议不使用的一个属性--> <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> 在Hibernate中的配置:<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  <property name="driverClass"><value>oracle.jdbc.driver.OracleDriver</value></property>  <property name="jdbcUrl"><value>jdbc:oracle:thin:@localhost:1521:Test</value></property>  <property name="user"><value>Kay</value></property>  <property name="password"><value>root</value></property>  <!--连接池中保留的最小连接数。-->                <property name="minPoolSize" value="10" />            <!--连接池中保留的最大连接数。Default: 15 -->             <property name="maxPoolSize" value="100" />            <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->                   <property name="maxIdleTime" value="1800" />            <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->                   <property name="acquireIncrement" value="3" />             <property name="maxStatements" value="1000" />              <property name="initialPoolSize" value="10" />              <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->           <property name="idleConnectionTestPeriod" value="60" />              <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->           <property name="acquireRetryAttempts" value="30" />              <property name="breakAfterAcquireFailure" value="true" />                  <property name="testConnectionOnCheckout" value="false" />  </bean>

View Code

package demo01;

import java.sql.Connection;
import java.sql.PreparedStatement;

import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import demo.JDBCUtils3;

public class TestC3P0 {
    @Test
    public void testAddUser1() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ComboPooledDataSource dataSource = new ComboPooledDataSource();// 默认方式加载
        // ComboPooledDataSource dataSource = new ComboPooledDataSource("yiqing");
        try {
            conn = dataSource.getConnection();
            String sql = "insert into users values(null,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "张三");
            pstmt.setString(2, "123");
            int rows = pstmt.executeUpdate();
            if (rows > 0) {
                System.out.println("添加成功!");
            } else {
                System.out.println("添加失败!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtils3.release(conn, pstmt, null);
        }
    }
}

  成功!

能够将C3P0连接池抽取出工具类:

图片 24图片 25

package demo01;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Utils {
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

    public static DataSource getDataSource() {
        return dataSource;
    }

    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

View Code

测试:

图片 26图片 27

package demo01;

import java.sql.Connection;
import java.sql.PreparedStatement;

import org.junit.Test;

import demo.JDBCUtils3;

public class TestC3P0 {
    @Test
    public void testAddUser1() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = C3P0Utils.getConnection();
            String sql = "insert into users values(null,?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "李四");
            pstmt.setString(2, "123123");
            int rows = pstmt.executeUpdate();
            if (rows > 0) {
                System.out.println("添加成功!");
            } else {
                System.out.println("添加失败!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            JDBCUtils3.release(conn, pstmt, null);
        }
    }
}

View Code

成功!

 

 

DBCP连接池:

自定义DBCP工具类:

图片 28图片 29

package DBCP;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPUtils {
    private static DataSource dataSource;
    static {
        try {
            // 1.加载找properties文件输入流
            InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");
            // 2.加载输入流
            Properties props = new Properties();
            props.load(is);
            // 3.创建数据源
            dataSource = BasicDataSourceFactory.createDataSource(props);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static DataSource getDataSource() {
        return dataSource;
    }

    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

View Code

测试:

图片 30图片 31

package DBCP;
import java.sql.Connection;
import java.sql.PreparedStatement;

import org.junit.Test;

public class TestDBCP {

    @Test
    public void testUpdateUserById(){
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = DBCPUtils.getConnection();
            String sql ="update users set upassword=? where uid=?";
            pstmt= conn.prepareStatement(sql);
            pstmt.setString(1, "456789");
            pstmt.setInt(2, 1);
            int rows = pstmt.executeUpdate();
            if(rows>0){
                System.out.println("更新成功!");
            }else{
                System.out.println("更新失败!");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

View Code

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图