JDBC实例--JDBC连接池技术解密,连接池对我们不再陌生

一、为什么我们要用连接池技术?

 

前面的数据库连接的建立及关闭资源的方法有些缺陷。统舱传统数据库访问方式:一次数据库访问对应一个物理连接,每次操作数据库都要打开、关闭该物理连接, 系统性能严重受损。

解决方案:数据库连接池(Connection Pool)。


系统初始运行时,主动建立足够的连接,组成一个池.每次应用应用程序请求数据库连接时,无需重新打开连接,而是从池中取出已有的连接,使用完后,不再关闭,而是归还。


二、连接池主要由三部分组成:连接池的建立、连接池中连接的使用管理、连接池的关闭。

 

三、连接池技术的核心思想

 

连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。

1.连接池的建立


在系统初始化时,根据相应的配置创建连接并放置在连接池中,以便需要使用时能从连接池中获取,这样就可以避免连接随意的建立、关闭造成的开销。

 

2.连接池中连接的使用管理


      连接池管理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。

      采用的方法是一个很有名的设计模式:Reference Counting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。


(1)当客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。如果存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用,引用计数加1)。如果没有空闲连接,则查看当前所开的连接数是不是已经达到maxConn(最大连接数),如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的maxWaitTime(最大等待时间)进行等待,如果等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。
(2)当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数是否小于minConn(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。


3.连接池的关闭


当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接),这与连接池的建立正好是一个相反过程。


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

 

四、连接池的实现

 

新建一个java工程并导入相应的包。

 

配置文件:

 

1 jdbc.driver=com.mysql.jdbc.Driver
2 jdbc.url=jdbc:mysql://localhost:3306/csdn
3 jdbc.user=root
4 jdbc.password=123456
5 initsize=1
6 maxactive=1
7 maxwait=5000
8 maxidle=1
9 minidle=1

 

dbcp的基本配置的介绍

1.initialSize :连接池启动时创建的初始化连接数量(默认值为0)
2.maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
3.maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
4.minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)
5.maxWait  :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)

DBUtil源码如下:

  1 package com.daliu.jdbc;
  2 
  3 import java.io.InputStream;
  4 import java.sql.Connection;
  5 import java.sql.SQLException;
  6 import java.util.Properties;
  7 
  8 import org.apache.commons.dbcp.BasicDataSource;
  9 
 10 /**
 11  * 使用连接池技术管理数据库连接
 12  */
 13 public class DBUtil {
 14     
 15     //数据库连接池
 16     private static BasicDataSource dbcp;
 17     
 18     //为不同线程管理连接
 19     private static ThreadLocal<Connection> tl;
 20     
 21     //通过配置文件来获取数据库参数
 22     static{
 23         try{
 24             Properties prop
 25                 = new Properties();
 26             
 27             InputStream is
 28                 = DBUtil.class.getClassLoader()
 29                   .getResourceAsStream(
 30                           "com/daliu/jdbc/db.properties");
 31             
 32             prop.load(is);
 33             is.close();
 34             
 35             //一、初始化连接池
 36             dbcp = new BasicDataSource();
 37             
 38             
 39             //设置驱动 (Class.forName())
 40             dbcp.setDriverClassName(prop.getProperty("jdbc.driver"));
 41             //设置url
 42             dbcp.setUrl(prop.getProperty("jdbc.url"));
 43             //设置数据库用户名
 44             dbcp.setUsername(prop.getProperty("jdbc.user"));
 45             //设置数据库密码
 46             dbcp.setPassword(prop.getProperty("jdbc.password"));
 47             //初始连接数量
 48             dbcp.setInitialSize(
 49                     Integer.parseInt(
 50                             prop.getProperty("initsize")
 51                     )
 52             );
 53             //连接池允许的最大连接数
 54             dbcp.setMaxActive(
 55                     Integer.parseInt(
 56                             prop.getProperty("maxactive")
 57                     )
 58             );
 59             //设置最大等待时间
 60             dbcp.setMaxWait(
 61                     Integer.parseInt(
 62                             prop.getProperty("maxwait")
 63                     )
 64             );
 65             //设置最小空闲数
 66             dbcp.setMinIdle(
 67                     Integer.parseInt(
 68                             prop.getProperty("minidle")
 69                     )
 70             );
 71             //设置最大空闲数
 72             dbcp.setMaxIdle(
 73                     Integer.parseInt(
 74                             prop.getProperty("maxidle")
 75                     )
 76             );
 77             //初始化线程本地
 78             tl = new ThreadLocal<Connection>();
 79         }catch(Exception e){
 80             e.printStackTrace();
 81         }
 82     }
 83     
 84     /**
 85      * 获取数据库连接
 86      * @return
 87      * @throws SQLException 
 88      */
 89     public static Connection getConnection() throws SQLException{
 90         /*
 91          * 通过连接池获取一个空闲连接
 92          */
 93         Connection conn 
 94                     = dbcp.getConnection();
 95         tl.set(conn);
 96         return conn;
 97     }
 98     
 99     
100     /**
101      * 关闭数据库连接
102      */
103     public static void closeConnection(){
104         try{
105             Connection conn = tl.get();
106             if(conn != null){
107                 /*
108                  * 通过连接池获取的Connection
109                  * 的close()方法实际上并没有将
110                  * 连接关闭,而是将该链接归还。
111                  */
112                 conn.close();
113                 tl.remove();
114             }    
115         }catch(Exception e){
116             e.printStackTrace();
117         }
118     }
119     
120     /**
121      * 测试是否连接成功
122      * @param args
123      * @throws SQLException
124      */
125     public static void main(String[] args) throws SQLException {
126         System.out.println(getConnection());
127     }
128 }


效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重温51汇编指令(附实验)

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 重温51汇编指令&#xff08;附实验&#xff09; 写在前面&#xff1a; 在电子控制…

SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解

2019独角兽企业重金招聘Python工程师标准>>> 作者&#xff1a;shede333主页&#xff1a;http://my.oschina.net/shede333 && http://blog.sina.com.cn/u/1509658847版权声明&#xff1a;原创文章&#xff0c;版权声明&#xff1a;自由转载-非商用-非衍生-保…

升级nginx,查看已经安装的模块,并隐藏或者修改版本号

升级前&#xff0c;查看已经安装的版本以及模块[rootmail ~]# /opt/nginx/sbin/nginx -Vnginx version: nginx/0.5.34 built by gcc 3.4.6 20060404 (Red Hat 3.4.6-3)configure arguments: --prefix/opt/nginx --sbin-path/opt/nginx/sbin/nginx --conf-path/opt/nginx/conf/n…

SpringCloudAlibaba微服务docker容器打包和部署示例实战

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 概述 我们使用前面《SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码…

MongoVUE的Collections数据不显示的解决方法

问题描述&#xff1a; 使用 mongoDB数据库&#xff0c; 数据添加成功了&#xff0c;使用命令行能查询出来&#xff0c;但在MongoVUE 中数据却不显示 (我使用的是 mongoDB 3.4 的版本) 原因&#xff1a;引擎问题&#xff0c;只要降到2.X版本就可以显示了     3.x默认是wire…

SaltStack WEB UI Halite初体验

闲来无聊&#xff0c;话说saltstack webui halite还一直没玩&#xff0c;于是就凑今天体验一把&#xff1b;很多尝鲜的同学都说halite的功能较少&#xff0c;而其也正符合其说明console&#xff0c;不过其UI我还是蛮喜欢的&#xff0c;个人觉得比较清新简洁、挺好下面就来安装体…

Envoy熔断限流实践(二)Rainbond基于RLS服务全局限流

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

TAppEncoder的main函数

TAppEncoder是编码器工程&#xff0c;完成视频序列的编码。 运行时&#xff0c;首先调用encmain.cpp中的main函数 main函数中完成的工作主要有初始化encoder类&#xff0c;解析cfg文件&#xff0c;然后调用TAppEncTop::encode函数进入下一层&#xff0c;并且对编码过程进行计时…

【大话云原生】微服务篇-五星级酒店的服务方式

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

如何在Web前端实现CAD图文字全文搜索功能之技术分享

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

基于Java (spring-boot)的仓库管理系统

一、项目介绍 本系统的使用者一共有系统管理员、仓库管理员和普通用户这3种角色: 1.系统管理员&#xff1a;通过登录系统后&#xff0c;可以进行管理员和用户信息的管理、仓库和物品分类的管理&#xff0c;以及操作日志的查询&#xff0c;具有全面的系统管理权限。 2.仓库管理…

基于语义感知SBST的API场景测试智能生成

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

2015 CALLED THE INTERFACE OF 2014

Writer&#xff1a;BYSocket&#xff08;泥沙砖瓦浆木匠&#xff09; 微博&#xff1a;BYSocket豆瓣&#xff1a;BYSocketReprint it anywhere u want. ”Hi , Happy New Year.Written in Stupid Enlish,Dont push me *.* ” 2014 System 2015 is coming.But 2014 is not over.…

论文解读(MERIT)《Multi-Scale Contrastive Siamese Networks for Self-Supervised Graph Representation Learni

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

Fiddler抓包9-保存会话(save)

前言 为什么要保存会话呢&#xff1f;举个很简单的场景&#xff0c;你在上海测试某个功能接口的时候&#xff0c;发现了一个BUG&#xff0c;而开发这个接口的开发人员是北京的一家合作公司。你这时候给对方开发提bug&#xff0c; 如何显得专业一点&#xff0c;能让对方心服口服…

『现学现忘』Git基础 — 17、Commit对象

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

Spring/MVC映射WEB-INF下的文件(img、css、js等)

学过Mvc的都知道并且会访问该目录下面的jsp 页面&#xff08;这是最基础的&#xff09; 但我们想访问里面的图片什么的&#xff0c;又该怎么去访问呢&#xff0c; 一句代码&#xff1a; <mvc:resources mapping"/img/**" location"/WEB-INF/img/"/> …

《HelloGitHub》第 73 期

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

typora + EasyBlogImageForTypora直接上传图片到博客园

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

20155320 第十一周课堂总结

20155320 第十一周课堂总结 未及时提交原因&#xff1a; 对代码掌握的不熟练&#xff0c;并且由于起初不知道自己电脑浏览器不支持蓝墨云图片提交&#xff0c;尝试几次后只能把图片传到手机上导致截图没有及时提交 1,。测试题目 1.修改教材P74 一行代码 NineNineTable.java, 让…