连接池——DBCP,C3P0,Druid 的使用

DBCP

 DBCP 是 阿帕奇 软件基金组织的开源连接池实现,使用该连接池,需要导入两个 jar 文件

  • commons-dbcp.jar:连接池的实现
  • commons-pool.jar:连接池实现的依赖库

常用配置项

分类 属性 描述
必须项 driverClassName 数据库驱动名称
  url 数据库的地址
  username 用户名
  password 密码
基本项(扩展) maxActive 最大连接数量
  minIdle 最小空闲连接
  maxIdle 最大空闲连接
  initialSize 初始化连接

定义配置文件

#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2?rewriteBatchedStatements=true
username=root
password =root
#初始连接数
initialSize=5
#最大连接属
maxActive=5
#超时时间
maxWait=3000

属性名字不能乱写,因为使用BasicDataSourceFactory.createDataSource(Properties properties) 创建DataSource对象时,需要传入 Properties ,该方法在源码中已经指定了属性文件的key

连接池——DBCP,C3P0,Druid 的使用_第1张图片

如果属性文件中的key与 源码中的key 不符,将无法读取到配置文件中对应的信息

创建连接对象

使用BasicDataSourceFactory 创建连接池对象

/*
*    DBCP工具类
*/
public class DBCPUtil {
    private static DataSource dataSource;
        
    private DBCPUtil(){}

    static {
        try {
            Properties p = new Properties();
            InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("db.properties");
            p.load(is);
            //BasicDataSourceFactory 可以避免从Properties取数据,比较方便
            dataSource = BasicDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接对象
     *
     * @return
     */
    public static Connection getConn() {
        try {
            //因为Connection线程不安全,每次都要返回一个新的
            return dataSource.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        throw new RuntimeException("数据库连接失败");
    }

    /**
     * 释放资源
     *
     * @param con
     * @param st
     * @param rs
     */
    public static void close(Connection con, Statement st, ResultSet rs) {
        //5:释放资源
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
           try {
               if (st != null) {
                    st.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (con != null) {
                        con.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

测试DBCP工具类

public class DBCPTest {
    @Test
    public void test1() throws Exception {
        String sql = "SELECT * FROM t_student";
        //从连接池中获取连接对象
        Connection conn = DBCPUtil.getConn();
        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            String name = rs.getString("name");
            int age = rs.getInt("age");
            System.out.println(name + ":" + age);
        }
    }
}

Druid

Druid 和 DBCP 的连接属性完全相同,只是创建连接池的对象不同

  • Druid 使用 DruidDataScourceFactory

  • DBCP 使用 BasicDataSourceFactory

准备环境:

  • druid-1.0.15.jar

配置文件

#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2?rewriteBatchedStatements=true
username=root
password =root
#初始连接数
initialSize=5
#最大连接属
maxActive=5
#超时时间
maxWait=3000

获取数据库连接池对象:通过工厂来获取:DruidDataScourceFactory

package com.itcast.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * Druid 连接池的工具类
 */
public class GruidUtils {
    //数据源
    private static DataSource ds;

    private GruidUtils(){}

    static {
        try {
//            Properties pro = PropertiesLoaderUtils.loadAllProperties("druid.properties");

            Properties p = new Properties();
            InputStream is = GruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            p.load(is);

            ds = DruidDataSourceFactory.createDataSource(p);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接对象
     *
     * @return 连接对象
     */
    public static Connection getConnection() {
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("数据库连接失败!");
        }
    }

    /**
     * 获取连接池
     *
     * @return
     */
    public static DataSource getDataSource() {
        return ds;
    }
    
    
    //释放资源
    public static void close(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

测试GruidUtils工具类

public class DruidTest {
    @Test
    public void test2() throws SQLException {
        /**
         * 完成添加操作:给t_student 表添加一条记录
         */
        String sql = "INSERT INTO t_student(name,age) VALUES(?,?)";

        //获取连接对象
        Connection conn = GruidUtils.getConnection();
        //获取语句执行对象
        PreparedStatement ps = conn.prepareStatement(sql);
        //设置占位符参数
        ps.setString(1, "乔峰");
        ps.setInt(2, 30);
        //执行SQL
        ps.executeUpdate();
    }
}

每个连接池的配置属性需要在项目中进行测试后,才能确定每个属性的值

各种连接池性能测试----阿里测试

Druid详细文档

C3P0

Hibernate 就推荐使用该连接池。C3P0 连接池 不仅可以自动清理使用的Connection ,还可以自动清理 Statement和Result,

C3P0 连接池需要导入 :

  • c3p0-0.9.1.2.jar
  • mchange-commons-java-0.2.12.jar

定义配置文件:

  • 名称:c3p0.properties 或者 c3p0-config.xml 必须是这两个名称,因为C3P0会自动去查找配置文件
  • 路径:直接将文件放在src目录下即可

  
  
  	
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/day25
    root
    root
    
    
    5
    10
    3000
  

   
    
    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/day25
    root
    root
    
    
    5
    8
    1000
  

创建核心对象:ComboPooledDataSource

//创建数据库连接池对象,不为ComboPooledDataSource 传值使用默认配置 default-config
//可以传入指定配置名称  otherc3p0
DataSource ds = new ComboPooledDataSource();

工具类

public class C3P0Utils {
    //数据源
    private static DataSource ds;

    static {
        //会自动查找配置文件
        ds = new ComboPooledDataSource();
    }

    /**
     * 获取连接对象
     *
     * @return 连接对象
     */
    public static Connection getConnection() {
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("数据库连接失败!");
        }
    }

}

测试工具类

    @Test
    public void test4() throws SQLException {
        //获取数据库连接
        Connection conn = C3P0Utils.getConnection();

        PreparedStatement ps = conn.prepareStatement("SELECT  * FROM t_student");
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString(2));
        }
    }

C3P0 无需手动加载配置文件,ComboPooledDataSource 会自动查找,前提是配置文件名称与它要求的名称一致。

 

你可能感兴趣的:(JDBC,连接池)