连接池 —— DBCP技术 和 C3P0 技术

一.概述

Sun公司约定: 如果是连接池技术,需要实现一个接口!

javax.sql.DataSource;

其他的开源组织提供了数据源的独立实现

二.DBCP技术使用

1.Apache:DBCP技术

  • DBCP是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
    Commons-dbcp.jar:连接池的实现
    Commons-pool.jar:连接池实现的依赖库
    包下载链接:传送门密码:nshu
    maven环境配置:
<dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>1.4</version>
    </dependency>
    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.6</version>
    </dependency>
  • Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
    核心类:BasicDataSource
  • 使用步骤
    引入jar文件
    --commons-dbcp-1.4.jar
    --commons-pool-1.5.6.jar
1.硬编码方式实现连接池
package com.huan.car.dao.poolDBCP;

import org.apache.commons.dbcp.BasicDataSource;
import org.junit.Test;

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

/**
 * Created by 马欢欢 on 2017/5/29.
 */
public class PoolDBCP {
    @Test
    public void testDbcp() throws SQLException {
        String url="jdbc:mysql://localhost:3306/car";//2.指定连接数据库的地址名称
        String user="root";
        String password = "root";//指定用户名和密码
        PreparedStatement pstmt;
        //连接池核心类
        BasicDataSource dataSource = new BasicDataSource();
        //连接池参数配置:初始化连接数,最大连接数
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");//驱动
        dataSource.setUrl(url);//连接字符串
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setInitialSize(3);//初始化连接数
        dataSource.setMaxActive(6);//最大连接数
        dataSource.setMaxIdle(3000);//最大空闲时间

        //获取连接
        Connection conn = dataSource.getConnection();
        pstmt = conn.prepareStatement(" delete from car where id= ? ");
        pstmt.setInt(1,10);
        pstmt.executeUpdate();
        //关闭
        conn.close();
    }
}

删除成功
2.配置方式实现连接池
  • 1.配置文件db.properties:

db.properties(注意当报错NullPointerException时,需要将文件添加到同级的classes文件中)配置文件中的key与BaseDataSouce属性一样

url=jdbc:mysql://localhost:3306/car
driverClassName=com.mysql.jdbc.Driver
username=root
password=root
initialSize=3
maxActive=6
maxIdle=3000
需要将文件添加到同级的classes文件中
  • 2.连接代码
  @Test
    public void testProp()throws Exception{
        PreparedStatement pstmt;
//        加载prop配置文件
        Properties prop = new Properties();
        //获取文件流
        InputStream inStream = PoolDBCP.class.getResourceAsStream( "db.properties");
        //加载属性配置文件
        prop.load(inStream);
        //根据prop配置文件直接创建数据源对象
        DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
        //获取连接
        Connection conn = dataSource.getConnection();
        pstmt = conn.prepareStatement(" delete from car where id= ? ");
        pstmt.setInt(1,11);
        pstmt.executeUpdate();
        //关闭
        conn.close();


    }
删除成功

三.C3P0技术使用[最常用的连接池技术]

C3P0连接池技术:

  • 最常用的连接池技术!Spring框架,默认支持C3P0连接池技术!
    C3P0连接池,核心类:
    CombopooledDataSource ds;
    使用:
  1. 下载,引入jar文件: c3p0-0.9.1.2.jar
    包下载链接:链接:c3p0-0.9.1.2.jar 密码:2bxo
    maven环境配置:
<dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>
  1. 使用连接池,创建连接
    a) 硬编码方式
    b) 配置方式(xml)[需要将文件添加到classes文件中的根目录下]
1.硬编码方式,使用C3P0
   //1.硬编码方式,使用C3P0
    @Test
    public void testCode() throws PropertyVetoException, SQLException {
        String url="jdbc:mysql://localhost:3306/car";//2.指定连接数据库的地址名称
        String user="root";
        String password = "root";//指定用户名和密码
        PreparedStatement pstmt;
        //创建连接池核心工具类
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //连接池参数配置:初始化连接数,最大连接数
        dataSource.setJdbcUrl(url);
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setUser(user);
        dataSource.setPassword(password);
        dataSource.setInitialPoolSize(3);
        dataSource.setMaxPoolSize(6);
        dataSource.setMaxIdleTime(1000);

        //从连接池对象中获取连接对象
        Connection conn = dataSource.getConnection();
        pstmt = conn.prepareStatement(" delete from car where id= ? ");
        pstmt.setInt(1,11);
        pstmt.executeUpdate();
        //关闭
        conn.close();

    }
2.配置方式,使用C3P0[重要]
  • c3p0-config.xml
<c3p0-config>
    <default-config>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/car</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">root</property>
        <property name="initialPoolSize">3</property>
        <property name="maxPoolSize">6</property>
        <property name="maxIdleTime">1000</property>
        <!--<property name="checkoutTimeout">30000</property>-->
        <!--<property name="maxIdleTimeExcessConnections">10</property>-->
        <!--<property name="maxConnectionAge">60</property>-->
        <!--<property name="propertyCycle">1</property>-->
        <!--<property name="minPoolSize">5</property>-->
        <!--<property name="maxStatements">0</property>-->
        <!--<property name="maxStatementsPerConnection">5</property>-->
        <!--<property name="maxAdministrativeTaskTime">4</property>-->
        <!--<property name="connectionCustomizerClassName">com.mchange.v2.c3p0.test.TestConnectionCustomizer</property>-->
        <!--<property name="unreturnedConnectionTimeout">15</property>-->
        <!--<property name="debugUnreturnedConnectionStackTraces">true</property>-->

        <!--
        <user-overrides user="swaldman">
          <property name="debugUnreturnedConnectionStackTraces">true</property>
        </user-overrides>
        -->

    </default-config>

    <!--
      <named-config name="dumbTestConfig">
        <property name="maxStatements">200</property>
        <property name="jdbcUrl">jdbc:test</property>
        <user-overrides user="poop">
          <property name="maxStatements">300</property>
        </user-overrides>
       </named-config>
    -->

</c3p0-config>

![需要将文件添加到classes文件中的根目录下]](http://upload-images.jianshu.io/upload_images/1616232-d65c0e47f27b605a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  • 源码
  //2.配置方式,使用C3P0
    @Test
    public void testXml() throws SQLException {
        PreparedStatement pstmt;
        //创建连接池核心工具类
        //自动加载根目录下面的c3p0配置文件【c3p0-config.xml】
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //从连接池对象中获取连接对象
        Connection conn = dataSource.getConnection();
        pstmt = conn.prepareStatement(" delete from car where id= ? ");
        pstmt.setInt(1,20);
        pstmt.executeUpdate();
        //关闭
        conn.close();

    }
  • 结果


    image.png

文章文集:JavaEE--学习笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容