欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三种数据连接池技术:C3P0,DBCP,Druid的部署和配置

程序员文章站 2022-05-24 12:30:00
...

1,数据库连接池简介

数据库连接池

(1)C3P0:是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以Hibernate官方推荐使用
(2)DBCP:是Apache提供的数据库连接池,tomcat服务器自带的DBCP数据库连接池。速度相对C3P0较快,但因自身存在BUG, Hibernate3已不再支持
(3)Druid:是阿里提供的数据库连接池,据说是集DBCP,C3P0优点于一身的数据库连接池

2,jar包

链接:https://pan.baidu.com/s/1hM2dhz3IlBg2-LXOlgg-Qg
提取码:ae12

3,C3P0:

  1. 需要导入的包
    三种数据连接池技术:C3P0,DBCP,Druid的部署和配置
    三种数据连接池技术:C3P0,DBCP,Druid的部署和配置
  2. 新建一个文件名为:c3p0-config.xml 的xml文件,文件名不能更改!

添加配置信息

<?xml version="1.0" encoding="utf-8" ?>
<c3p0-config>

    <named-config name="testpool">

        <!-- 四个基本配置信息 -->
        <!-- Driver类的位置 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <!-- url连接 -->
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
        <!-- 用户名 -->
        <property name="user">root</property>
        <!-- 密码 -->
        <property name="password">root</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数据库连接池中最多维护的Statements的个数 -->
        <property name="maxStatements">50</property>
        <!-- 每个连接中最多可以使用的Statements的个数 -->
        <property name="maxStatementsPerConnection">2</property>

    </named-config>
</c3p0-config>

  1. 测试是否配置成功

创建数据库连接池代码

public class C3P0Test {
    public static void main(String[] args) throws SQLException {
    	//获取数据库连接池,注意这里的参数:testpool,是配置文件中的: <named-config name="testpool">
        ComboPooledDataSource cpds = new ComboPooledDataSource("testpool");
        //获取连接
        Connection conn = cpds.getConnection();
        //打印是否获取成功
        System.out.println(conn);
    }
}

控制台

九月 23, 2020 3:03:51 下午 com.mchange.v2.log.MLog <clinit>
信息: MLog clients using java 1.4+ standard logging.
九月 23, 2020 3:04:00 下午 com.mchange.v2.c3p0.C3P0Registry banner
信息: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
九月 23, 2020 3:04:01 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> testpool, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hgewapac1fjnwme1doqsvo|6f539caf, idleConnectionTestPeriod -> 0, initialPoolSize -> 10, jdbcUrl -> jdbc:mysql://localhost:3306/test, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements -> 50, maxStatementsPerConnection -> 2, minPoolSize -> 10, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
[email protected]

4,DBCP

  1. 需要导入的包
    三种数据连接池技术:C3P0,DBCP,Druid的部署和配置
    三种数据连接池技术:C3P0,DBCP,Druid的部署和配置
  2. 创建一个dbcp.properties类型的文件,文件名可以更改

配置信息

#四个基本信息
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root

#连接池的配置
initialSize=10
#。。。。。。
#根据需要进行设置
#dbcp连接池常用基本配置属性
#
#1.initialSize :连接池启动时创建的初始化连接数量(默认值为0)
#
#2.maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
#
#3.maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
#
#4.minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)
#
#5.maxWait  :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)
#
#6.poolPreparedStatements:开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)
#
#7.maxOpenPreparedStatements:开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)
#
#8.minEvictableIdleTimeMillis  :连接池中连接,在时间段内一直空闲, 被逐出连接池的时间
#
#9.removeAbandonedTimeout  :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
#
#10.removeAbandoned  :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)
  1. 测试配置是否成功

获得连接池和数据库连接代码

public class DBCPTest {
    public static void main(String[] args) throws Exception {
        //通过系统类加载器获取流,参数就是创建的文件:dbcp.properties
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties");
        //创建Properties 实例
        Properties pro = new Properties();
        //加载流
        pro.load(is);
        //获取数据库连接池
        DataSource ds = BasicDataSourceFactory.createDataSource(pro);
        //获取数据库连接
        Connection conn = ds.getConnection();
        //测试
        System.out.println(conn);
    }
}

控制台

jdbc:mysql://localhost:3306/test, UserName=[email protected], MySQL Connector Java

5,Druid

  1. 需要导入的包
    三种数据连接池技术:C3P0,DBCP,Druid的部署和配置
    三种数据连接池技术:C3P0,DBCP,Druid的部署和配置

  2. 创建一个druid.properties类型的文件,文件名可以更改

文件配置信息

#四个基本配置
url=jdbc:mysql://localhost:3306/test
username=root
password=root
driverClassName=com.mysql.jdbc.Driver

#线程池配置
#1,initialSize :初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
#2,maxActive :最大连接池数量
#3,minIdle :最小连接池数量
#4,maxWait :获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
#5,poolPreparedStatements :是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
#6,maxOpenPreparedStatements :要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
#7,validationQuery :用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
#8,testOnBorrow :申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
#9,testOnReturn :归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
#10,testWhileIdle :建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
#11,timeBetweenEvictionRunsMillis :有两个含义:
    #1) Destroy线程会检测连接的间隔时间2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
#12,connectionInitSqls :物理连接初始化的时候执行的sql
#13,exceptionSorter :当数据库抛出一些不可恢复的异常时,抛弃连接
#14,filters :属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
#14,proxyFilters :类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系


  1. 测试是否配置成功

测试代码

public class DruidTest {
    public static void main(String[] args) throws Exception {
        //通过系统类加载器获取流
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
        //创建Properties实例
        Properties pro = new Properties();
        //加载流
        pro.load(is);
        //获取数据库连接池
        DataSource source = DruidDataSourceFactory.createDataSource(pro);
        //获取连接
        Connection conn = source.getConnection();
        //测试
        System.out.println(conn);
    }
}

控制台

九月 23, 2020 3:21:10 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
[email protected]

PS:如果有错误请指正


END