走进JavaWeb技术世界3:JDBC的进化与链接池技术

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到个人仓库里查看html

https://github.com/h2pl/Java-Tutorialjava

喜欢的话麻烦点下Star哈linux

文章首发于个人我的博客:git

www.how2playlife.com程序员

本文是微信公众号【Java技术江湖】的《走进JavaWeb技术世界》其中一篇,本文部份内容来源于网络,为了把本文主题讲得清晰透彻,也整合了不少我认为不错的技术博客内容,引用其中了一些比较好的博客文章,若有侵权,请联系做者。
该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中常常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个Java Web技术体系,造成本身的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每一个知识点对应的面试题以及参考答案。github

若是对本系列文章有什么建议,或者是有什么疑问的话,也能够关注公众号【Java技术江湖】联系做者,欢迎你参与本系列博文的创做和修订。web

JDBC数据库链接池

谈谈链接池、线程池技术原理

作互联网研发,最先接触使用jdbc技术,为了数据库链接可以复用,会用到c3p0、dbcp等数据库链接池。应该是研发人员最先接触的数据库链接池,再到httpclient http链接池,再到微服务netty链接池,redis客户端链接池,以及jdk中线程池技术。面试

       这么多数据库、http、netty链接池,jdk线程池,本质上都是链接池技术,链接池技术核心是链接或者说建立的资源复用。redis

       链接池技术核心:经过减小对于链接建立、关闭来提高性能。用于用户后续使用,好处是后续使用不用在建立链接以及线程,由于这些都须要相关不少文件、链接资源、操做系统内核资源支持来完成构建,会消耗大量资源,而且建立、关闭会消耗应用程序大量性能。sql

       网络链接自己会消耗大量内核资源,在linux系统下,网络链接建立自己tcp/ip协议栈在内核里面,链接建立关闭会消耗大量文件句柄(linux中万物皆文件,一种厉害抽象手段)系统资源。当下更可能是应用tcp技术完成网络传输,反复打开关闭,须要操做系统维护大量tcp协议栈状态。

       链接池本质上是构建一个容器,容器来存储建立好的线程、http链接、数据库链接、netty链接等。对于使用方至关于黑盒,按照接口进行使用就能够了。各个链接池构建、使用管理详细过程大概分红如下三部分。

       第一部分:首先初始化链接池,根据设置相应参数,链接池大小、核心线程数、核心链接数等参数,初始化建立数据库、http、netty链接以及jdk线程。

       第二部分:链接池使用,前边初始化好的链接池、线程池,直接从链接池、线程中取出资源便可进行使用,使用完后要记得交还链接池、线程池,经过池容器来对资源进行管理。

       第三部分:对于链接池维护,链接池、线程池来维护链接、线程状态,不可用链接、线程进行销毁,正在使用链接、线程进行状态标注,链接、线程不够后而且少于设置最大链接、线程数,要进行新链接、线程建立。

       经过上边能够了解到各类链接池技术以及线程池原理或者说套路,理解原理才能不被纷繁复杂表象掩盖。

       下面谈谈构建本身链接池,其实理解了链接池、线程原理,可使用ArrayList来构建本身链接池、线程池。初始化时建立配置链接数、线程,存储在ArrayList容器中,使用时从ArrayList从取出链接、线程进行使用,执行完任务后,提交回ArrayList容器。前提条件是单线程,在多线程状态下要用线程安全容器。

       前边根据原理介绍了一个简单链接池、线程池怎样构建,实际工业级别线程池还要考虑到链接状态,短链接重连,线程池维护管理高效,线程池稳定等多个因素。

       须要用到链接池而又没有相关开源产品可用时,java链接池可使用common-pool2来构建,好比google开源gRPC技术,自己是高性能跨平台技术,但目前做为微服务使用,没有链接池、负载均衡等相应配套,这时能够根据须要本身基于Java容器构建本身链接池。也能够利用common-pool2构建链接池来提高应用性能,以及保持高可用。common-pool2自己不只仅能够构建链接池使用,还能够用来构建对象池。

       链接池还有一个反作用就是实现了高可用,在微服务场景下一个链接不可用,那么再从netty链接池中取出一个进行使用,避免了链接不可用问题。

       掌握原理从比较全面掌握各类池技术,避免数据库链接池,再到httpclient http链接池,再到微服务netty链接池,redis客户端链接池,以及jdk中线程池,对象池各类各样池技术,使咱们眼花缭乱,花费过多时间,掌握原理机制以不变应万变。

       推广一下这个方法,其余技术也是相似,深刻掌握其原理,就能够明白其余相似技术类似原理,避免疲于应对各类新技术。但每一种架构设计与实现又与领域有着关系,也不可讲原理不顾实际状况扩展。理论与架构设计、源码学习相结合才是最好的,但愿有帮助。

JDBC 数据库链接池 

转自:

什么状况下使用链接池?

对于一个简单的数据库应用,因为对于数据库的访问不是很频繁。这时能够简单地在须要访问数据库时,就新建立一个链接,用完后就关闭它,这样作也不会带来什么明显的性能上的开销。可是对于一个复杂的数据库应用,状况就彻底不一样了。频繁的创建、关闭链接,会极大的减低系统的性能,由于对于链接的使用成了系统性能的瓶颈。

使用链接池的好处

  1. 链接复用。经过创建一个数据库链接池以及一套链接使用管理策略,使得一个数据库链接能够获得高效、安全的复用,避免了数据库链接频繁创建、关闭的开销。
  2. 对于共享资源,有一个很著名的设计模式:资源池。该模式正是为了解决资源频繁分配、释放所形成的问题的。把该模式应用到数据库链接管理领域,就是创建一个数据库链接池,提供一套高效的链接分配、使用策略,最终目标是实现链接的高效、安全的复用。

链接池的实现

数据库链接池的基本原理是在内部对象池中维护必定数量的数据库链接,并对外暴露数据库链接获取和返回方法。

外部使用者可经过 getConnection 方法获取链接,使用完毕后再经过 close 方法将链接返回,注意此时链接并无关闭,而是由链接池管理器回收,并为下一次使用作好准备。

Java 中有一个 DataSource 接口, 数据库链接池就是 DataSource 的一个实现

经常使用数据库链接池

1、JDBC数据库链接池的必要性

  在使用开发基于数据库的web程序时,传统的模式基本是按如下步骤:

  ①在主程序(如servlet、beans)中创建数据库链接。
  ②进行sql操做
  ③断开数据库链接。

  这种模式开发,存在的问题:

  ①普通的JDBC数据库链接使用 DriverManager 来获取,每次向数据库创建链接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。须要数据库链接的时候,就向数据库要求一个,执行完成后再断开链接。这样的方式将会消耗大量的资源和时间。数据库的链接资源并无获得很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库链接操做将占用不少的系统资源,严重的甚至会形成服务器的崩溃。
  ②对于每一次数据库链接,使用完后都得断开。不然,若是程序出现异常而未能关闭,将会致使数据库系统中的内存泄漏,最终将致使重启数据库。
  ③这种开发不能控制被建立的链接对象数,系统资源会被毫无顾及的分配出去,如链接过多,也可能致使内存泄漏,服务器崩溃。

2、数据库链接池(connection pool)

  数据库链接池简单介绍

  为解决传统开发中的数据库链接问题,能够采用数据库链接池技术。

  数据库链接池的基本思想就是为数据库链接创建一个“缓冲池”。预先在缓冲池中放入必定数量的链接,当须要创建数据库链接时,只需从“缓冲池”中取出一个,使用完毕以后再放回去。

  数据库链接池负责分配、管理和释放数据库链接,它容许应用程序重复使用一个现有的数据库链接,而不是从新创建一个。

  数据库链接池在初始化时将建立必定数量的数据库链接放到链接池中,这些数据库链接的数量是由最小数据库链接数来设定的。不管这些数据库链接是否被使用,链接池都将一直保证至少拥有这么多的链接数量。链接池的最大数据库链接数量限定了这个链接池能占有的最大链接数,当应用程序向链接池请求的链接数超过最大链接数量时,这些请求将被加入到等待队列中。

  数据库链接池工做原理:

  数据库链接池技术的优势

  资源重用:

  ①因为数据库链接得以重用,避免了频繁建立,释放链接引发的大量性能开销。在减小系统消耗的基础上,另外一方面也增长了系统运行环境的平稳性。

  更快的系统反应速度:
  数据库链接池在初始化过程当中,每每已经建立了若干数据库链接置于链接池中备用。此时链接的初始化工做均已完成。对于业务请求处理而言,直接利用现有可用链接,避免了数据库链接初始化和释放过程的时间开销,从而减小了系统的响应时间

  新的资源分配手段:
  对于多应用共享同一数据库的系统而言,可在应用层经过数据库链接池的配置,实现某一应用最大可用数据库链接数的限制,避免某一应用独占全部的数据库资源

  统一的链接管理,避免数据库链接泄露:
  在较为完善的数据库链接池实现中,可根据预先的占用超时设定,强制回收被占用链接,从而避免了常规数据库链接操做中可能出现的资源泄露

3、两种开源的数据库链接池

  JDBC 的数据库链接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口一般由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
  ①DBCP 数据库链接池
  ②C3P0 数据库链接池

  DataSource 一般被称为数据源,它包含链接池和链接池管理两个部分,习惯上也常常把 DataSource称为链接池

  数据源和数据库链接不一样,数据源无需建立多个,它是产生数据库链接的工厂,所以整个应用只须要一个数据源便可。

  当数据库访问结束后,程序仍是像之前同样关闭数据库链接:conn.close(); 但上面的代码并无关闭数据库的物理链接,它仅仅把数据库链接释放,归还给了数据库链接池。

参考文章

https://blog.csdn.net/u010028461/article/details/78932109
http://www.javashuo.com/article/p-soxkdvhe-a.html
http://www.javashuo.com/article/p-nbltmpip-cm.html
https://blog.csdn.net/weixin_43124134/article/details/82586062
https://www.jianshu.com/p/0737ac60c7df

微信公众号

我的公众号:黄小斜

黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。

做者专一于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得和程序人生,目前黄小斜的CSDN博客有百万+访问量,知乎粉丝2W+,全网已有10W+读者。

黄小斜是一个斜杠青年,坚持学习和写做,相信终身学习的力量,但愿和更多的程序员交朋友,一块儿进步和成长!

原创电子书:
关注公众号【黄小斜】后回复【原创电子书】便可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》

程序员3T技术学习资源: 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 “资料” 便可免费无套路获取。

考研复习资料:
计算机考研大礼包,都是我本身考研复习时用的一些复习资料,包括公共课和专业的复习视频,这里也推荐给你们,关注公众号后,后台回复关键字 “考研” 便可免费获取。

技术公众号:Java技术江湖

若是你们想要实时关注我更新的文章以及分享的干货的话,能够关注个人公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,做者黄小斜,专一 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!

Java工程师必备学习资源: 一些Java工程师经常使用学习资源,关注公众号后,后台回复关键字 “Java” 便可免费无套路获取。

个人公众号

相关文章
相关标签/搜索