数据库连接池:Dbcp和C3p0学习

原创 2017年08月03日 15:47:46

本篇博客知识点

1.演示Dbcp、C3p0获得数据库连接对象的两种方式
2.演示Dbcp、C3p0常用功能和区别
3.用Dbcp、C3p0完成一个数据库连接池的工具类
4.学习使用DBUtil工具类

演示Dbcp、C3p0获得数据库连接对象的两种方式

dbcp和c3p0普通方式连接数据库学习

@Test
    public void demo1() throws Exception{
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://127.0.0.1:3306/ake?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "1234";

        // 底层方式连接数据库
        Class.forName(driver);
        Connection con =DriverManager.getConnection(url, username, password);

        // 通过dbcp方式
        //*当前的dbcpUils有一点地方要注意一下,一个连接关闭之后,同一线程再次获取到的连接是原来关闭过的连接。
        //针对该问题,我们需要留意一下,采用某种解决办法,比如:在con.close()之后紧接收写一行清空线程管理池中的con对象如t.set(null)
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        Connection con_dbcp = ds.getConnection();

        // 通过c3p0方式
        ComboPooledDataSource cds = new ComboPooledDataSource();
        cds.setDriverClass(driver);
        cds.setJdbcUrl(url);
        cds.setUser(username);
        cds.setPassword(password);
        Connection con_c3p0 = cds.getConnection();

        System.out.println("原来方式拿到的con:"+con);
        System.out.println("dbcp方式拿到的con:"+con_dbcp);
        System.out.println("c3p0方式拿到的con:"+con_c3p0);
    }

这里写图片描述

* dbcp和c3p0通过配置文件方式连接数据库学习*

@Test
    public void dem02() throws Exception{
        Properties p = new Properties();
        // 方式一读取配时,置文件应该方法 bin(classpath路径)目录下面 (有 getClassLoader)
//      p.load(DbcpPoolDemoLeran.class.getClassLoader().getResourceAsStream("jdbc.properties"));
        // 方式二 读取时,配置文件应该刚到 该类生成的.class文件下 (有 getClassLoader)
        p.load(DbcpPoolDemoLeran.class.getResourceAsStream("jdbc.properties"));

        //底层方式方式
        String driver = p.getProperty("driver");
        String url = p.getProperty("url");
        String username = p.getProperty("username");
        String password = p.getProperty("password");
        // 获得连接
        Class.forName(driver);
        Connection con =DriverManager.getConnection(url, username, password);
        System.out.println("con:"+con);

        // 通过dbcp方式: 这种方式也需要前面 的new Properties()和p.load(...);
        DataSource ds = BasicDataSourceFactory.createDataSource(p);
        Connection con_dpcp = ds.getConnection();
        System.out.println("con_dpcp:"+con_dpcp);

        // 通过c3p0的方式:配置文件c3p0-config.xml,必须方到Src下面
        // c3p0默认的就是配置文件方式连接数据库的,只需要去把配置文件配好就行了
        ComboPooledDataSource cds = new ComboPooledDataSource(); 
        Connection con_c3p0 = cds.getConnection();
        System.out.println("con_c3p0:"+con_c3p0);
    }

这里写图片描述

演示Dbcp、C3p0常用功能和区别

演示dpcp常见功能:用过connection对象会重复用

public void demo1() throws Exception{
        BasicDataSource ds = new BasicDataSource();//ds即是我们之前自己做的pool
        ds.setUsername("root");
        ds.setPassword("1234");
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf8");

        Connection con = ds.getConnection();
        System.out.println("con:"+con);

        System.out.println("-------以下展示dbcp的一些属性或它的性能,这些属性可以get也可以set--------");
        System.out.println(ds.getDefaultAutoCommit()); //默认提交方式: true,不开启事务
        System.out.println(ds.getDriverClassName());
        System.out.println(ds.getMaxActive()); //同时可支持多少个活动连接
        System.out.println(ds.getInitialSize());
        System.out.println(ds.getMaxIdle());
        System.out.println(ds.getMaxWait()); //-1, 没拿连接,就一直等待

        System.out.println("------以下演示从ds池中获取一些连接--------");
        ds.setMaxActive(9);
        for(int i=0; i<25; i++){
            Connection conn = ds.getConnection();
            System.out.println(conn.hashCode());
            if(i%2==1){
                conn.close();
            }
        }
    }

这里写图片描述

演示c3p0常见的功能:用过connection对象会不会重复用

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/ake?useUnicode=true&characterEncoding=utf8");

        Connection con = ds.getConnection();
        System.out.println("con:"+con);

        System.out.println("-------以下展示c3p0的一些属性或它的性能,这些属性可以get也可以set--------");
        System.out.println(ds.getInitialPoolSize()); //初始池大小
        System.out.println(ds.getMaxPoolSize());
        System.out.println(ds.getLoginTimeout()); //-1, 没拿连接,就一直等待

        System.out.println("------以下演示从ds池中获取一些连接--------");
        for(int i=0; i<35; i++){
            Connection conn = ds.getConnection();
            System.out.println(conn.hashCode());
            if(i%2==1){
                conn.close(); //c3p0中,连接关闭之后不会被重新使用,每次从池中获取到的是新创建的连接
            }
        }

这里写图片描述

用Dbcp、C3p0完成一个数据库连接池的工具

Dbcp数据库连接池的工具 :记得设置好配置文件和导工具包

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;




public class ConnUtils {
    private static DataSource ds;// 单利的池
    private static ThreadLocal<Connection> t = new ThreadLocal<Connection>();

    static{
        try {
            Properties p  = new Properties();
            p.load(ConnUtils.class.getClassLoader().getResourceAsStream("dbcp.properties"));
            ds = BasicDataSourceFactory.createDataSource(p);
            BasicDataSource ds2 = (BasicDataSource) ds;
            //设置最大连接数目
            ds2.setMaxActive(10);

        } catch (Exception e) {
            throw new RuntimeException("数据库连接池创建失败!", e);
        }
    }

    public static DataSource getDataSource(){
        return ds;
    }

    public static Connection getCon() throws SQLException{
        Connection con = t.get();
        if(con==null){
            con = ds.getConnection();
            t.set(con);
        }
        return  con;
    }
    public static void clearConFromThreadLocal(){
        t.set(null);
    }
}

C3p0数据库连接池的工具 :记得设置好配置文件和导工具包

package cn.hncu.c3p0;

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.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import com.mchange.v2.c3p0.ComboPooledDataSource;
/////※※※以后我们开发可以做一个这样的池来使用
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("数据库连接池创建失败!", e);
        }
    }

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

    public static Connection getConn() throws SQLException{
        Connection con = t.get();
        if(con==null){
            con = ds.getConnection();
            t.set(con);
        }
        return con;
    }

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

学习使用DBUtil工具类

核心代码

    QueryRunner run = new QueryRunner(C3POConnUtils.getDataSource());
    run.query(sql, 把数据封装成不同心事的参数);

案例学习代码

package Studying.d18.Demo;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.junit.Test;

import Studying.d18.Utils.C3POConnUtils;
/*
掌握DBUtils工具的关键是学好两个类(接口): 
  1) QueryRunner类: 用于执行sql语句的
  2) ResultSetHandler接口: 用于封装返回结果的 (具体使用是用它的实现类)
*/
public class DbUtilsDemo {

    @Test //我们原来的查询功能实现代码,,要求封装成List<Stud>的形式返回
    public void query0Demo() throws Exception{
        Connection con = C3POConnUtils.getCon();
        String sql = "select * from stud";
        Statement st = con.createStatement();
        ResultSet rs = st.executeQuery(sql);
        List<Stud> studs = new ArrayList<Stud>();
        while(rs.next()){
            Stud s = new Stud();
            s.setId( rs.getString("id") );
            s.setName( rs.getString("name"));
            studs.add(s);
        }

        rs.close();
        st.close();
        con.close();

        System.out.println(studs);
    }

    @Test //使用apache的DBUtils框架进行查询功能的实现代码,,要求封装成List<Stud>的形式返回
    public void query0_DbUtilsHello_Demo() throws Exception{
        String sql = "select * from stud";
        QueryRunner run = new QueryRunner(C3POConnUtils.getDataSource());
        List<Stud> studs = run.query(sql, new BeanListHandler<Stud>(Stud.class));
        System.out.println(studs);
    }

    @Test
    public void query0_DbUtilsHello2_Demo() throws Exception{
        QueryRunner run = new QueryRunner(C3POConnUtils.getDataSource());
        List<Map<String,Object>> studs = run.query("select * from stud", new MapListHandler());
        System.out.println(studs);
    }

}
版权声明:本文为博主原创文章,大家一起学习进步。

JDBC之连接池DBCP与c3p0的简单使用

JDBC之连接池DBCP与c3p0的简单使用 一背景 二常用的开源数据库连接池 1 dbcp 2 c3p0 三dbcp与c3p0对比JDBC之连接池DBCP与c3p0的简单使用提示:本内容通过慕课网学...
  • u014292162
  • u014292162
  • 2017年04月07日 17:44
  • 871

c3p0、dbcp、tomcat jdbc pool 连接池区别(推荐使用jdbc pool)

查看资料,得知dbcp和c3p0都是单线程的,在高并发的环境下性能会非常低下, 决定换用tomcat自带的jdbc-pool,关于jdbc-pool的项目介绍。 区别参考链接:http://www...
  • chenaini119
  • chenaini119
  • 2017年04月05日 14:36
  • 2349

数据库连接池:dbcp和c3p0,以及数据库操作框架Dbutils

(1),dbcp连接池 1,commons-dbcp-1.4.jar
  • u010644448
  • u010644448
  • 2014年07月23日 12:29
  • 1477

连接池与数据源:DBCP以及C3P0的使用

一、连接池的概念和使用  在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存...
  • JAVA528416037
  • JAVA528416037
  • 2015年06月29日 13:28
  • 2380

连接池配置c3p0、dbcp、tomcat jdbc pool 及常用数据库的driverClass和驱动包

连接池配置c3p0、dbcp、tomcat jdbc pool 及常用数据库的driverClass和驱动包
  • u010127245
  • u010127245
  • 2016年06月15日 16:24
  • 760

c3p0,dbcp与druid 三大连接池的区别

c3p0,dbcp与druid 三大连接池的区别
  • diyu122222
  • diyu122222
  • 2017年12月09日 22:38
  • 57

开源DBCP、C3P0、Proxool 、 BoneCP连接池的比较

简介 项目主页 使用评价  DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用 http...
  • sqjhwl
  • sqjhwl
  • 2013年05月08日 15:36
  • 6389

DBCP连接池与C3P0连接池的比较

DBCP连接池与C3P0连接池的比较            如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源,如果创建一个池,用池来管理Connection,这样就可以重复...
  • m15732622413
  • m15732622413
  • 2017年02月15日 12:16
  • 6057

c3p0,dbcp与druid 三大连接池的区别

了解c3p0,dbcp与druid   说到druid,这个是在开源中国开源项目中看到的,说是比较好的数据连接池。于是乎就看看。扯淡就到这。   下面就讲讲用的比较多的数据库连接池。(其实我最先接...
  • qq_34359363
  • qq_34359363
  • 2017年05月26日 09:41
  • 4387

c3p0、dbcp、tomcat jdbc pool 连接池区别(推荐使用jdbc pool)

查看资料,得知dbcp和c3p0都是单线程的,在高并发的环境下性能会非常低下, 决定换用tomcat自带的jdbc-pool,关于jdbc-pool的项目介绍。 区别参考链接:http://www...
  • u010363836
  • u010363836
  • 2016年04月19日 13:14
  • 10457
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库连接池:Dbcp和C3p0学习
举报原因:
原因补充:

(最多只允许输入30个字)