码迷,mamicode.com
首页 > 数据库 > 详细

mysql笔记八——开源数据库连接池DBCP和C3P0的使用

时间:2016-08-13 14:13:02      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:

DBCP数据库连接池

  • DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个 jar 文件:
    Commons-dbcp.jar:连接池的实现 Commons-pool.jar:连接池实现的依赖库 Tomcat
    的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

  • 核心代码

static{
    InputStream in = JdbcUtil.class.getClassLoader().
            getResourceAsStream("dbcpconfig.properties");
    Properties prop = new Properties();
    prop.load(in);

    BasicDataSourceFactory factory = new BasicDataSourceFactory();
    dataSource = factory.createDataSource(prop);
}
  • 我的代码示例
package dpcpPoolUse;

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

import javax.sql.DataSource;

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

public class DbcpPoolDemo {

    @Test
    public void testDbcp() throws SQLException, InterruptedException{
        //      DataSource pool=new BasicDataSource();//不能用DataSource,因为里面没有set。。函数
        BasicDataSource pool=new BasicDataSource();//创建一个池对象
        pool.setDriverClassName("com.mysql.jdbc.Driver");
        pool.setUrl("jdbc:mysql://127.0.0.1:3306/sstud?useUnicode=true&characterEncoding=utf-8");
        pool.setUsername("root");
        pool.setPassword("1234");

        System.out.println(pool.getDefaultCatalog());//获取默认参数
        System.out.println(pool.getInitialSize());//获取连接池初始化大小
        //      System.out.println(pool.getLoginTimeout());//登录限制时间
        System.out.println(pool.getMaxWait());//pool最长等待时间(-1)
        System.out.println(pool.getMaxIdle());////最大空闲时间。如果一个用户获取一个连接,不用,多长时间会被强行收回
        System.out.println(pool.getMaxActive());//pool最多获得数
        System.out.println("__________________");
        //自己设置参数
        //      pool.setMaxWait(1);
        //      pool.setMaxIdle(1);
        pool.setMaxActive(20);
        for(int i=0;i<20;i++){
            //          Thread.sleep(1100);
            Connection con=pool.getConnection();//优先拿到刚刚使用过得
            System.out.println(i+":::::::::::"+con.hashCode());
            //          con.close();
        }
    }
    //通过配置文件  读取
    @Test
    public void testPropertyFile() throws Exception{
        Properties p=new Properties();
        //      p.load(ClassLoader.getSystemClassLoader().getSystemResourceAsStream("dpcp.properities"));//配置文件要放在src(bin)的根目录---classpath的根
        p.load(DbcpPoolDemo.class.getResourceAsStream("dbcp.properities"));//配置文件和当前类的class放在一起
        DataSource pool=BasicDataSourceFactory.createDataSource(p);//DataSource要通过配置文件读取
        //DataSource 不能进行常规设置
        //从它的池中获取连接(8个)
        for(int i=0;i<10;i++){
            Connection con=pool.getConnection();
            System.out.println(i+":::::"+con.hashCode());
            if((i&1)==0){
                con.close();
            }
        }
    }
}
  • 连接池DbcpUtil工具
package dpcpPoolUse;

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

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DbcpUtil {
    private static DataSource pool=null;
//  static BasicDataSource pool=new BasicDataSource();//创建一个池对象
    private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();
    static{
        Properties p=new Properties();
        try { 
//          pool.setDriverClassName("com.mysql.jdbc.Driver");
//          pool.setUrl("jdbc:mysql://127.0.0.1:3306/sstud?useUnicode=true&characterEncoding=utf-8");
//          pool.setUsername("root");
//          pool.setPassword("1234");
             Class.forName("com.mysql.jdbc.Driver");//需要自己写
            p.load(DbcpPoolDemo.class.getResourceAsStream("dbcp.properities"));//配置文件和当前类的class放在一起
            System.out.println(p);
            pool=BasicDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //返回DataSource--池
       public static DataSource getDataSource(){
           return pool;
       }

    public static ThreadLocal<Connection> getTl() {
        return tl;
    }

    public static void setTl(Object object) {
        DbcpUtil.tl = (ThreadLocal<Connection>) object;
    }

    public static Connection getCon(){
        Connection con=tl.get();
        if(con==null){
            try {
                con=pool.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            tl.set(con);
        }
        return con;
    }
    public static void main(String[] args) {
        System.out.println(getCon());
    }

}

C3P0数据库连接池

  • C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
  • 和DPCP的区别:
    1).dbcp没有自动回收空闲连接的功能
    2).c3p0有自动回收空闲连接功能

mysql笔记八——开源数据库连接池DBCP和C3P0的使用

标签:

原文地址:http://blog.csdn.net/wangjian_an/article/details/52198974

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!