Java数据库连接池2——c3p0

来源:互联网 发布:网络市场监管 编辑:程序博客网 时间:2024/05/16 07:08

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