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; 在电子控制…

第四章 C++数据类型

#include#includeusing std::cout;using std::cin;using namespace std;int main(){ // int a; //布尔 bool check; check0;//初始化为false check true; //字符 char ch; ch0; cout<< ch <<endl; cout<<(int)ch<<endl; for(int i32;i<128;i) { …

HttpClient 学习整理(转)

来自 http://www.blogjava.net/Alpha/archive/2007/01/22/95216.htmlHttpClient 是我最近想研究的东西&#xff0c;以前想过的一些应用没能有很好的实现&#xff0c;发现这个开源项目之后就有点眉目了&#xff0c;令人头痛的cookie问题还是有办法解决滴。在网上整理了一些东西&…

Hyperledger Fabric 通道配置文件和容器环境变量详解

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 摘要 Fabric 网络启动的过程中需要进行大量配置&#xff0c;新学时对各个配置的作…

课程作业二

课程作业二 github链接 题目要求&#xff1a; 编写一个程序&#xff0c;要求计算给定的圆的半径求圆的面积&#xff0c;并将所结果打印出来。需要建立一个工程&#xff0c;将程序写为两个.cpp与一个.h文件。 文件分离的感想&#xff1a; 对于本次作业&#xff0c;是一道我们平时…

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

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

windows下wamp安装

1.apache安装 php模块添加&#xff1a;LoadModel php5_module D:/wamp/php/php5apache2_2.dll 然后搜索“addtype”&#xff0c;在下方加入 AddType application/x-httpd-php .php 这句话&#xff0c;以使你的服务器能够识别php文件。 2.php安装 php.ini 打开mysql扩展 3.mysql…

图说Oracle基础知识

http://www.cnblogs.com/hsiang/ 本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0c;谢谢。转载于:https://www.cnblogs.com/zbj815/p/6773508.html

petite-vue源码剖析-逐行解读@vue-reactivity之effect

Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 当我们通过effect将副函数向响应上下文注册后&#xff0c;副作用函数内访问响应式对…

string.Format 格式化

1、格式化货币&#xff08;跟系统的环境有关&#xff0c;中文系统默认格式化人民币&#xff0c;英文系统格式化美元&#xff09; string.Format("{0:C}",0.2) 结果为&#xff1a;&#xffe5;0.20 &#xff08;英文操作系统结果&#xff1a;$0.20&#xff09; 默认格…

8步教你打开Android之门 NDK入门教程

这是一篇Android NDK开发的入门教程&#xff0c;在这一教程结束后&#xff0c;你将创建你自己的项目&#xff0c;从Java代码简单地调用原生C语言代码。 本文为一篇外文翻译&#xff0c;我们将介绍如何学习安装 Android NDK 并开始使用它。在这一教程结束后&#xff0c;你将创建…

升级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…

(3)[wp7数据存储] WP7 IsolatedStorage系列篇——通过XmlSerializer读写XML文件 [复制链接]...

发表于 2012-5-17 15:51:07 |只看该作者 |倒序浏览 分享到&#xff1a;本帖最后由 agameboy 于 2012-5-17 17:08 编辑这一篇我们会通过XmlSerializer读写XML文件&#xff0c;跟多的相关文章请参考WP7 IsolatedStorage系列篇&#xff01;需要的命名空间&#xff1a;using System…

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;打造一…

UV坐标

1.什么是uv坐标 所有的图象文件都是二维的一个平面。水平方向是U&#xff0c;垂直方向是V&#xff0c;通过这个平面的&#xff0c;二维的UV坐标系。我们可以定位图象上的任意一个象素。但是一个问题是如何把这个二维的平面贴到三维的NURBS表面和多边形表面呢&#xff1f; 对于N…

再说WCF Data Contract KnownTypeAttribute

WCF 中的序列化是用DataContractSerializer,所有被[DataContract]和[DataMemeber]标记的类和属性会被DataContractSerializer序列化。在WCF中使用Contract模式来分辨和指定序列化/反序列化的类型&#xff0c;它是通过http://xmlns/Class这样的命名空间来标识这个序列化的对象的…

pyinotify结合ftplib自动上传新建的文件

应用场景&#xff1a;从国内往国外上传&#xff0c;因国际带宽影响&#xff0c;速度很慢&#xff0c;于是做了一个中转FTP&#xff0c;而自动上传需求也就诞生了。代码地址&#xff1a;https://github.com/coocla/linux/blob/master/ftp/autoupload_ftp.py sftp类型&#xff1…