MySQL---数据库从入门走向大神系列(十三)-BasicDataSource创建DataSource(DBCP连接池配置)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL---数据库从入门走向大神系列(十三)-BasicDataSource创建DataSource(DBCP连接池配置)

DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

首先,下载必须的jar包

dbcp包,目前版本是2.1.1 :

http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

pool包,目前版本是2.4.2:

http://commons.apache.org/proper/commons-pool/download_pool.cgi

Apache Commons Logging 包 目前版本为1.2:

http://commons.apache.org/proper/commons-logging/download_logging.cgi

MySQL的jar包mysql-connector-java-5.1.39-bin目前是5.1.39版本:

http://dev.mysql.com/downloads/connector/j/

演示代码:

package cn.hncu.dbcp;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.junit.Test;
public class DbcpPoolDemo {
    // 纯Java方式设置参数,使用dbcp池
    @Test
    public void testDbcp() {
        BasicDataSource pool = new BasicDataSource();// 连接池
        pool.setUsername("root");
        pool.setPassword("1234");
        pool.setDriverClassName("com.mysql.jdbc.Driver");
        pool.setUrl("jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8");
        System.out.println(pool.getMaxIdle());// 最大空闲时间。如果一个用户获取一个连接,不用,多长时间会被强行收回
        System.out.println(pool.getMaxWaitMillis());// 在抛出异常之前,池等待连接被回收的最长时间(当没有可用连接时)。设置为-1表示无限等待。
        System.out.println(pool.getInitialSize());// 初始化时有几个Connection
        System.out.println(pool.getMaxTotal());// 最多能有多少个Connection
        System.out.println("----------------");
        // pool.setMaxTotal(20);//可以我们自己设置池的相关参数,如最大连接数
        // 从它的池中获取连接
        for (int i = 0; i < 20; i++) {
            Connection con = null;
            try {
                con = pool.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println(i + ":" + con.hashCode());
        }
    }
    // 通过配置文件方式设置参数,使用dbcp池
    @Test
    public void testPropertyFile() throws Exception {
        Properties p = new Properties();
        p.load(DbcpPoolDemo.class.getResourceAsStream("dbcp.properties"));// 配置文件和当前类的class放在一起
        // p.load(DbcpPoolDemo.class.getClassLoader().getResourceAsStream("dbcp.properties"));//配置文件要放在src(bin)的根目录---classpath的根
        DataSource pool = BasicDataSourceFactory.createDataSource(p);
        // 从它的池中获取连接
        for (int i = 0; i < 20; i++) {
            Connection con = pool.getConnection();
            System.out.println(con.hashCode());
            if (i % 2 == 0) {
                con.close();
            }
        }
    }
}

一开始,默认的可以new的Connection对象为8个!

而且就算你是刚把原来的connection对象.close()也不会拿到重复Connection对象,以前的版本是会拿到原来还回去的Connectin对象的。

Connection池-本地线程管理对象

package cn.hncu.dbcp;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class DbcpUtil {
    private static DataSource pool;
    private static ThreadLocal<Connection> t = new ThreadLocal<Connection>();
    static{
        try {
            //读取配置文件
            Properties p = new Properties();
            p.load(DbcpUtil.class.getResourceAsStream("dbcp.properties"));// 配置文件和当前类的class放在一起
            pool = BasicDataSourceFactory.createDataSource(p);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //返回DataSource--池
    public static DataSource getDataSource(){
        return pool;
    }
    public static Connection getConnection() throws SQLException{
        //从本地线程管理对象t中拿
        Connection con = t.get();
        if(con==null){
            con=pool.getConnection();
            //放入t中
            t.set(con);
        }
        return con;
    }
}

相对于自己写Connection池,用第三方的扩展包显然方便多。

转载请附上原文博客链接:  

http://blog.csdn.net/qq_26525215

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
4天前
|
SQL 关系型数据库 MySQL
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
|
4天前
|
SQL 关系型数据库 MySQL
【MySQL-1】理解关系型数据库&数据的数据模型
【MySQL-1】理解关系型数据库&数据的数据模型
|
4天前
|
SQL 关系型数据库 MySQL
【MySQL-3】图形化界面工具DataGrip安装&配置&使用
【MySQL-3】图形化界面工具DataGrip安装&配置&使用
|
4天前
|
关系型数据库 MySQL Linux
【MySQL-2】MySQL的下载&安装&启停&配置环境变量【一条龙教程】
【MySQL-2】MySQL的下载&安装&启停&配置环境变量【一条龙教程】
|
5天前
|
关系型数据库 MySQL 数据库
Docker数据库Mysql
Docker数据库Mysql
|
5天前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之DataWorks集成实例绑定到同一个vpc下面,也添加了RDS的IP白名单报错:数据源配置有误,请检查,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
18 0
|
5天前
|
存储 SQL 关系型数据库
mysql查询数据库表大小怎么操作
mysql查询数据库表大小怎么操作
|
5天前
|
关系型数据库 MySQL PHP
【PHP 开发专栏】PHP 连接 MySQL 数据库的方法
【4月更文挑战第30天】本文介绍了 PHP 连接 MySQL 的两种主要方法:mysqli 和 PDO 扩展,包括连接、查询和处理结果的基本步骤。还讨论了连接参数设置、常见问题及解决方法,如连接失败、权限和字符集问题。此外,提到了高级技巧如使用连接池和缓存连接信息以优化性能。最后,通过实际案例分析了在用户登录系统和数据管理中的应用。
|
6天前
|
关系型数据库 MySQL 数据库
【MySQL】:数据库事务管理
【MySQL】:数据库事务管理
19 0