Java数据库连接池2——c3p0

本文介绍如何使用c3p0实现数据库连接池管理,包括通过纯Java代码配置及从XML配置文件读取配置的方式,并提供了一个实用的c3p0工具类。

Java数据库连接池2——c3p0

主要内容

1、用纯Java方式获取连接池
2、从配置文件中拿连接池
3、自己做一个c3p0的Utils,用于包装一个ThreadLocal
附录:所有要用到的工具包的链接

首先导驱动包
这里写图片描述

用纯Java方式获取连接池

与dbcp不同的除了set,get的某些方法,还有每次拿一个连接都是新创建的。

// 纯JAVA
    @Test
    public void demo1() throws Exception {
        ComboPooledDataSource ds = new ComboPooledDataSource();
        ds.setUser("root");
        ds.setPassword("1234");
        ds.setDriverClass("com.mysql.jdbc.Driver");
        ds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf8");
        try {
            Connection con = ds.getConnection();
            System.out.println("con:" + con);
            System.out.println("-----以下演示c3p0属性-------");
            System.out.println(ds.getInitialPoolSize());// 初始化大小
            System.out.println(ds.getLoginTimeout());// 最大等待时间
            System.out.println(ds.getMaxIdleTime());// 最大空闲时间
            System.out.println(ds.getMaxPoolSize());//最大同时连接数 15
            System.out.println("------以下演示从池中获取链接-------");
            for (int i = 0; i < 10; i++) {
                Connection conn = ds.getConnection();
                System.out.println(conn.hashCode());
                // 内存地址不同,每次从池中获取到的是新创建的链接
                if (i % 2 == 1) {
                    conn.close();
                }
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

从配置文件中拿连接池

这里的配置文件位于src下,是一个XML文件
这里写图片描述
该xml的代码:

<c3p0-config>
    <!-- 默认配置,如果没有指定则使用这个配置 -->
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">
        <!-- 原样,不解析 -->
            <![CDATA[jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=UTF-8]]>
        </property>
        <property name="user">root</property>
        <property name="password">1234</property>
        <!-- 初始化池大小 -->
        <property name="initialPoolSize">2</property>
        <!-- 最大空闲时间 -->
        <property name="maxIdleTime">30</property>
        <!-- 最多有多少个连接 -->
        <property name="maxPoolSize">10</property>
        <!-- 最少几个连接 -->
        <property name="minPoolSize">2</property>
        <!-- 每次最多可以执行多少个批处理语句 -->
        <property name="maxStatements">50</property>
    </default-config> 
    <!-- 命名的配置 -->
    <named-config name="mypool">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/abc</property>
        <property name="user">root</property>
        <property name="password">1234</property>
        <!-- 如果池中数据连接不够时一次增长多少个 -->
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">100</property>
        <property name="minPoolSize">50</property>
        <property name="maxPoolSize">1000</property>
        <property name="maxStatements">0</property>
        <property name="maxStatementsPerConnection">5</property> <!-- he's important, but there's only one of him -->
    </named-config>
</c3p0-config> 

演示从配置文件中拿:

//注意c3p0的位置是位于src下(不可变)
    @Test //加载配置文件c3p0-config.xml   
    public void demo2() throws Exception {
        //空参方法指的是:加载默认c3p0-config.xml(配置文件)
        //ComboPooledDataSource ds = new ComboPooledDataSource();
        //参数指定的,配置文件中的配置<named-config name="mypool">
        ComboPooledDataSource ds = new ComboPooledDataSource("mypool");
        Connection con = ds.getConnection();
        System.out.println(con);
        System.out.println(ds.getMaxPoolSize());
    }

自己做一个c3p0的Utils,用于包装一个ThreadLocal

和dbcp大同小异,不过c3p0在某些方面强过于dbcp

public class C3p0Pool {
    private static DataSource ds;// 单例的池
    private static ThreadLocal<Connection> t = new ThreadLocal<Connection>();
    static {
        try {
            ds =new ComboPooledDataSource();
        } catch (Exception e) {
            throw new RuntimeException("数据库连接池创建失败!");
        }
    }

    // 以后会用到这个功能 :
    public static DataSource getDataSource() {
        return ds;
    }

    public static Connection getConnection() {
        Connection con = t.get();
        if (con == null) {
            try {
                con = ds.getConnection();
                t.set(con);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return con;
    }

    public static void cleanConFromThradeLocal() {
        t.set(null);
    }
}

附录:所有要用到的工具包的链接

http://pan.baidu.com/s/1hrQBXyO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值