• 【BasicDataSource】DBCP连接池(BasicDataSource类)详解


     

              Java基础-DBCP连接池(BasicDataSource类)详解

                                     作者:尹正杰

    版权声明:原创作品,谢绝转载!否则将追究法律责任。

      实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池。

    一.连接池概述

    1>.什么是连接池

      用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

    2>.规范

      Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!常见的连接池:DBCP、C3P0。本篇博客的主角是DBCP连接池。

    二.DBCP连接池

      DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池。如果我们想要使用它的功能的话,需要导入jar包,可以用Maven方式进行下载包,它可以帮我们解决一些依赖关系。Maven的使用请参考:http://www.cnblogs.com/yinzhengjie/p/9017416.html

    1>.导入连接池jar包

    2>.常见配置项

    分类

    属性

    描述

    必须项

    driverClassName

    数据库驱动名称

    url

    数据库的地址

    username

    用户名

    password

    密码

    基本项(扩展)

    maxActive

    最大连接数量

    minIdle

    最小空闲连接

    maxIdle

    最大空闲连接

    initialSize

    初始化连接

      想要查看更详细的信息可参考DBCP的官网:http://commons.apache.org/proper/commons-dbcp/configuration.html

    三.BasicDataSource类的使用

    1>.准备数据库实验环境

    复制代码
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 
     7 CREATE TABLE Teacher(
     8     id INT PRIMARY KEY AUTO_INCREMENT,
     9     Name varchar(30) COLLATE gbk_bin DEFAULT NULL,
    10     Age int DEFAULT NULL,
    11     Job varchar(50),
    12     JobDescription varchar(100)
    13 );
    复制代码

    2>.代码如下:

    复制代码
     1 #@author :yinzhengjie
     2 #Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     3 #EMAIL:y1053419035@qq.com
     4 #
     5 DriverName=com.mysql.jdbc.Driver
     6 url=jdbc:mysql://192.168.0.254:5200/yinzhengjie?useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true
     7 username=root
     8 password=yinzhengjie
     9 initialSize=10
    10 maxIdle=5
    11 minIdle=3
    12 maxActive=1
    复制代码
    复制代码
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.note3;
     7 
     8 import javax.sql.DataSource;
     9 import org.apache.commons.dbcp.BasicDataSource;
    10 import java.util.ResourceBundle;
    11 
    12 /**
    13  *    在dbcp连接池的jar中,有 一个定义好的BasicDataSource累,通过查看源码,发现该实现类已经帮我们实现类了数据源的规范接口,即javax.sql.DataSource
    14  */
    15 public class JDBCUtils {
    16     
    17     //创建DataSource接口的实现类对象(BasicDataSource),我们的dbcp工具包已经帮我们实现好了,咱们直接用就好!
    18     private static BasicDataSource dataSource = new BasicDataSource();    
    19     
    20     //定义数据库链接变量
    21     private static final String DRIVERNAME;
    22     private static final String URL;
    23     private static final String USERNAME;
    24     private static final String PASSWORD;
    25     private static final int INITIALSIZE;
    26     private static final int MAXIDLE;
    27     private static final int MINLDEL;
    28     private static final int MAXACTIVE;
    29     
    30     static {
    31         //注意,我在Windows的配置文件全名是:“yinzhengjie.properties”,但是我们在给ResourceBundle的getBundle传参时应该注意两件事:第一,只传递文件名称并不传递文件后缀(即:yinzhengjie),第二,该文件应该在classpath中或者是跟包名在同一路径(即:在src目录中)
    32         DRIVERNAME = ResourceBundle.getBundle("yinzhengjie").getString("DriverName");
    33         URL = ResourceBundle.getBundle("yinzhengjie").getString("url");
    34         USERNAME = ResourceBundle.getBundle("yinzhengjie").getString("username");
    35         PASSWORD = ResourceBundle.getBundle("yinzhengjie").getString("password");
    36         INITIALSIZE = Integer.parseInt( ResourceBundle.getBundle("yinzhengjie").getString("initialSize"));
    37         MAXIDLE = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("maxIdle"));
    38         MINLDEL = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("minIdle"));
    39         MAXACTIVE = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("maxActive"));
    40     }
    41     
    42     //静态代码块,对象BasicDataSource对象中的配置,自定义
    43     static {
    44         //链接数据库的4个最基本信息,通过对象的set方法进行设置如下:
    45         dataSource.setDriverClassName(DRIVERNAME);                    //设置数据库驱动
    46         dataSource.setUrl(URL);                                        //设置访问数据库的路径
    47         dataSource.setUsername(USERNAME);                            //设置登录数据库的用户名
    48         dataSource.setPassword(PASSWORD);                            //设置登录数据库的密码
    49         
    50         //对象连接池中的常见配置项,以下的四个配置可以不配置(因为有默认配置),但是上面的四个是必须要配置的!
    51         dataSource.setInitialSize(INITIALSIZE);            //指定初始化的连接数
    52         dataSource.setMaxActive(MAXIDLE);                  //指定最大链接数量
    53         dataSource.setMaxIdle(MINLDEL);                    //指定最大空闲数
    54         dataSource.setMinIdle(MAXACTIVE);               //指定最小空闲数
    55     }
    56     
    57     //定义静态方法,返回BasicDataSource类的对象
    58     public static DataSource getDataSource() {
    59         return dataSource;
    60     }
    61 
    62 }
    复制代码
    复制代码
     1 /*
     2 @author :yinzhengjie
     3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
     4 EMAIL:y1053419035@qq.com
     5 */
     6 package cn.org.yinzhengjie.note3;
     7 
     8 import java.sql.SQLException;
     9 import java.util.List;
    10 import java.util.Map;
    11 
    12 import org.apache.commons.dbutils.QueryRunner;
    13 import org.apache.commons.dbutils.handlers.ArrayListHandler;
    14 import org.apache.commons.dbutils.handlers.MapListHandler;
    15 
    16 public class QueryRunnerDemo {
    17     //定义两个方法,实现数据表的添加,数据表查询,QueryRunner类对象,写在类成员位置
    18     private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
    19     
    20     public static void main(String[] args) {
    21 //        insert();
    22         select();
    23     }
    24     
    25     //数据表查询
    26     private static void select() {
    27         String sql = "SELECT * FROM Teacher where name = ?";
    28         try {
    29             String FirstArgs = "尹正杰";
    30             List<Map<String, Object>> list = qr.query(sql, new MapListHandler(), FirstArgs);
    31             //遍历集合list
    32             for (Map<String, Object> map : list) {
    33                 for(String key :map.keySet()){
    34                     System.out.println(key + ": " + map.get(key) );
    35                 }
    36             }
    37         } catch (SQLException e) {
    38             System.out.println(e);
    39             throw new RuntimeException("数据查询失败!");
    40         }
    41     }
    42     
    43     //数据表添加数据
    44     private static void insert() {
    45         String sql = "INSERT INTO Teacher VALUES(null,?,?,?,?)";
    46         Object[] params = {"尹正杰",26,"高级云计算工程师","负责网站架构维护,维护上万台服务器正常运行!"};
    47         
    48         try {
    49             int row = qr.update(sql,params);
    50             if(row != 0) {
    51                 System.out.println("添加成功");
    52             }
    53         } catch (SQLException e) {
    54             e.printStackTrace();
    55             throw new RuntimeException("数据添加失败!");
    56         }
    57     }
    58 }
    复制代码
  • 相关阅读:
    MySQL 虚拟列 Secondary Indexes and Generated Columns 基于列产生索引
    iOS证书(.p12)和描述文件(.mobileprovision)申请
    Filecoin indexer 技术解读
    CRC校验码简介及CRC16的计算方法
    cmake中添加引用动态链接和静态链接库
    最新云原生网络技术标准来了,为企业提供基础架构能力权威指南
    开发、运维、业务都说好的全栈云原生长这样!
    DevSecOps:云原生安全风险“避坑”指南
    rediscli 命令总结
    win10更新提示要卸载virtualbox
  • 原文地址:https://www.cnblogs.com/zzsuje/p/15412051.html
Copyright © 2020-2023  润新知