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

本篇博客知识点

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);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值