博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础-DBCP连接池(BasicDataSource类)详解
阅读量:6804 次
发布时间:2019-06-26

本文共 6466 字,大约阅读时间需要 21 分钟。

          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的使用请参考:

1>.导入连接池jar包

2>.常见配置项

分类

属性

描述

必须项

driverClassName

数据库驱动名称

url

数据库的地址

username

用户名

password

密码

基本项(扩展)

maxActive

最大连接数量

minIdle

最小空闲连接

maxIdle

最大空闲连接

initialSize

初始化连接

  想要查看更详细的信息可参考DBCP的官网:

 

三.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=1010 maxIdle=511 minIdle=312 maxActive=1
yinzhengjie.properties 文件内容
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.DataSource14  */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 }
JDBCUtils.java 文件内容
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
> list = qr.query(sql, new MapListHandler(), FirstArgs);31 //遍历集合list32 for (Map
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 }

 

你可能感兴趣的文章
springCloud全实战超详细代码demo+笔记
查看>>
Golang 知识点总结
查看>>
Bitmap
查看>>
(转)arcgis面状文件坐标导出方法
查看>>
LPC824 周立功AM824学习笔记
查看>>
SQL数据库学习之路(三)
查看>>
开发https应用
查看>>
js轮换广告
查看>>
墨菲定律
查看>>
Maven
查看>>
MovieReview—Kingsman THE SECRET SERVICE(王牌特工之特工学院)
查看>>
C语言成长学习题(九)
查看>>
银行里的迷宫
查看>>
codevs——1294 全排列
查看>>
9.13模拟试题
查看>>
自动生成单据编号
查看>>
[noip模拟]画展<队列的基础知识>
查看>>
Java时间转换类实现
查看>>
ios之UITextfield (2)
查看>>
appium自动化测试 环境搭建
查看>>