00:00
这个上午的话呢,我们把这个do呢,其他的相关的,呃呃此类也好,或者对于接口来讲叫时间类也好,这个我们就写完了就啊下课再啊下课再看行,然后呢,这个完了以后呢,我们接着来讲下边这一张,这个呢叫数据库连接池啊,这张的话呢,就相当于是针对于咱们说数据库连接来说的,前面呢,我们一上来讲的就是数据库连接,只不过当时的连接呢,我们是自己手动的来进行一个获取的啊,那么这块的话,我们来看一下,真正在开发当中,我们该怎么去获取连接啊,这块呢就提到了叫数据库连接池啊,连接池这个落脚点呢叫做池,前面的话呢,我们接触过应该是两种池是吧?对,一个呢叫线程池,一个叫四符串常量池。这个线程池跟字符链常量池呢,其实好处呢不太一样,哎,我们这个数据库连接池的好处跟线程池是一样的,对跟线程池一样的啊,那咱们先看下这个问题的一个引入。
01:01
说我们在基于数据库呢,做这个外部程序开发的时候呢,在主程序当中,这咱们后边讲web大家就知道了啊,我们在搜类里边写具体的业务逻辑,需要呢,在so类当中来获取数库连接,哎,然后呢进行操作,操作完以后的话呢,再进行这个连接的一个断开,说整个这样一个过程啊,这是下边一个描述哈,这个我们讲外部的时候呢,大家知道的一个过程了,那么在这个过程当中,这个连接如果是我们自己创建的的话啊,确实呢,能够实现对数据库的操作,这没问题,这个老师闪我先。先这样一下啊,哎,确实能够实现对数据库操作,但是这里边呢,会存在一些问题,什么问题呢?看一下哎,第一个说普通的GDBC数据库连接,我们使用的是Java manager,说每次连接的时候呢,我们还需要去验证用户名密码,哎,包括呢,你需要把connection这个对象呢,加载到内存当中,哎然后当你执行完以后的话呢,我们还需要呢,呃,我们还需要把它进行一个移除,说这时候呢,说我们数据库连接这个资源呢,并没有得到很好的一个重复利用。
02:01
啊,尤其呢,当我们如果同时几百人上千人,甚至更多的人同时去访问诶数据库的话呢,同时的给一下子创建这么多的连接,甚至有可能造成服务器的一个崩溃重启啊这是我们说的这个问题啊,有的时候呢,这个一般呢,我们都在除夕的时候会见到这种情况是吧,一般除夕这两年我看微信做的好像还不是太好啊嗯,在这个除夕的时候呢,发红包,你发现这个红包呢,经常就就是不是像平时一样,你发完以后呢,立马大家就能看着,或者你点一下的话呢,就能收红包了,这说你点半天它那个打不开,诶说明就是同时服务器呢,用这个涌上来人太多了啊,并发能力处理的不足啊,比较庆幸的是去年百度那边年终的那个冠名是百度拿到的是吧,那百度呢,你看没有经过前年的迭代啊,然后一上来的话呢,服务器就很稳定,那说明百度这百度这个技术做的还是可以的。啊,你像这个阿里,阿里比如说每年的双11说这也没问题啊,但是阿里的双11它是经过好多年的迭代的啊,一开始的时候呢,他也不行啊,不是也谈不上不行,一开始都是同时在线人数少,然后呢,第二年人数更多,第三年人数更多,所以他有一个迭代的过程,但除夕的话呢,没有给你机会去迭代是吧,一上来当晚上人就非常的多啊,所以百度去年做的还是值得表扬的,我觉得啊,但是微信这块呢,做的就稍微差一点啊,然后下一个说呢,对于每一次数据连接呢,使用完以后呢,我们都得去断开啊说呢,如果要出现相关的异常,未能未能正常关闭呢,就会导致叫内存泄露,最终呢会导致数据库呢进行重启,诶,这里边提到一个内存泄露,那我们回忆一下说Java的内存泄露是什么意思。
03:41
执啊,一直没有被销毁,对的啊,就是这个内存泄露呢,跟咱们说这个C语言的内存泄露呢,稍微有点区别,C语言里边这个内存泄露,因为咱们知道C里边呢,都有这个指针了啊啊,那么C的内存泄露就是你把这个指针给弄丢了,弄丢以后的话呢,我们就不能够再直接去调用你呃对应指向的那个对象了,而C里边呢,是我们主动的回收内存的啊,因为呢,你这个指针弄丢以后,这个内存呢,就不能够被回收掉了,诶我们称为叫内存泄露了,那Java里边呢,呃,一般我们不不显示去说这个指针这个事儿了哈,那Java里边内存泄露就是指的是我们内存中存在有对象啊,不能够被回收的情况啊,那这样就称为叫内存泄露。
04:19
啊,这里边就提到关于我们这个呃,连接的问题哈,连接呢,要能要是没有被正常的关闭,那相当于的连接对象就一直存在,诶导致呢,出现内存的泄漏问题,好这个然后同时的话呢,说这种开发不能够控制被创建的连接的对象数啊,比如上面也提到了我们有服务器,服务器呢再强大,它也有一个上限,也有一个峰值,那么一旦要是超过峰值的时候呢,该怎么处理呢?啊一种处理思路呢,或者我们认为呢,应该既然你超过你的上限了,那么如果还有人去访问,那就不要让它再获取连接了,那这样的话呢,服务器自然呢就。不会出现这个崩溃或重启的问题啊,但是呢,我们现在呢,没有一个很好的管理在这里边,只要呢用户去请求服务器去创建啊,即使呢超出他的负载能力,他还想试图去做,最后呢导致时代呢不行了。
05:09
就崩溃了啊,就跟说这个人一样是吧,这人的话呢,他你给大家这个持续的加工作那一种呢,就是说不行,我这个已经达到我的这个工作的这个上限了是吧?嗯,其余你给我多的这个工作我就做不了了,这个时候呢,他还是一个比较正常的状态啊,如果还有人的话呢,就是只要给他加工作,他就同意,他就同意,他就同意,最终结果这个人就累趴下了。哎,就相当于服务器呢,崩溃了,哎,那默认情况下呢,就是它就是统一的一种状态,哎,那我们怎么实现呢,去做相关的一些管理,让他呢,诶能够控制啊用户的连接啊,这就是我们下边要提到这个数据库连接池技术。哎,针对上面提出这些问题,诶,我们引入了叫连接池技术,基本思想就是为数据库连接呢建立一个缓冲池,说预先呢,在缓冲池当中放入一定数量的连接,当需要建立数据库连接的时候,我们就从缓冲值当中呢取出一个,使用完以后呢再放回去。
06:07
哎,这个跟咱们前面讲的这个线程池其实是一个思路的啊,县城咱们当时讲也是,比如说咱以手机端为例,呃,这块大家看这个新闻,或者你看这个美团外卖啊等等,手机端呢,都是这样的一个套路啊,每一个都是一个item。而且一般的话呢,这个item的左边呢,通常都是一个图片了,那这个图片呢,我们知道一般呢会相对大一些,那么下载图片耗时呢就较长,那我们通过手快速的去滑动的过程当中,一个item呢都会露出来,露出来的时候呢,都会试图的去联网,那么我们这时候呢,每一个啊下载图片的线程是单独呢,就用的我们这个线程池来做的,如果你要是自己去创建一个线程的话,那么在你快速的滑动过程当中,我们需要创建大量的线程。啊,那这个线程呢,在你使用完以后呢,诶它就又销毁了,所以这个呢,肯定是比较耗费内存,同时的话呢,你要自己创建也要花一定的时间啊,这个就没有我们直接提供一个线程池要好,哎属于这样一个情况,哎,所以呢,我们这个输纽连接池跟咱们线程池的套路是一样的。
07:10
哎,就跟咱们当中讲这个,诶先城池的时候呢,举的一个例子啊,说大家呢,现在需要去天安门了,哎,你不会说呢,自己想着去造一辆自行车,或者说造一辆汽车是吧?哎,当然呢,可以,你就比较耗时呗,造完以后的话呢,开过去了,到了天安门以后,你要做的事儿已经结束了,哎你把这个汽车或者是自行车呢,就地销毁。啊,暂且先不说被抓的事儿是吧,诶消费完以后的话呢,你挂完了,当你回头又想去的时候呢,自己再造一辆自行车或者是汽车,所以这显然呢,呃,是比较耗时的啊,是比较耗时的,那另外一个角度呢,也没有实现更好的资源重复利用啊,你自己用完以后呢,其实这个呢,你还可以考虑让别人用,但是你没有这样做,直接呢给它close了啊,直接呢从内存中销毁掉了啊,没有得到一个很好的资源利用啊,那同时呢,也没有任何的管理可言啊,比如说大家呢,同样的这一个时刻,现在都想去天安门看升旗了啊,比如说11当天啊,这个没有任何管理的情况下呢,所有人都这个时间涌过去,可能道路就全拥堵了,就类似于我们说服务器呢,崩溃了。
08:16
哎,这种一样啊,那怎么办呢?就是我们通常选择就是公共交通,哎,大家呢,可以坐地铁,可以坐公交,然后呢,你过去那这时候呢,首先用不着你自己去创建一个连接了啊,直接选择公共交通就行,省了你自己创建的一个时间啊,能够更快的去连接上,其次的话呢,诶,当你到了以后呢,诶这个公共车,公共车公共汽车或者地铁,还可以再拉别人资源呢,也能得到一个很好的充物利用。嗯,再同时的话呢,就是呃,我们可以去控制公交或者地铁发车的一个频率,达到一个管理的效果,虽然说呢,很多人都要去天安门,但是呢,我们就是十分钟发一趟,不能再快了,再快的话呢,你说可能就会拥堵了,所以我们就是坚持十分钟一趟啊,那有些人的话呢,就是来不及,这个车十分钟一趟都坐不下,那没办法,那你就等着。
09:05
啊,就像我们这里边儿,比如我们这儿呢,假设哈这个数据库连接池当中,我们就提供了四个连接。啊,那么默认状态状态下呢,大家都是状态,然后我们通过Java程序呢去呃操作数据库,我们就拿这个池子里边一个连接,一旦呢,我拿到这个连接以后呢,它就从free状态呢,变成叫busy状态。哎,就进入忙碌状态了,那牙IG呢,就是我们可以有诶四个程序,一人拿一个。假设呢,呃,峰值就是只有四个,那如果来了第五个了,哎第五个的话呢,你就得等着,哎,当我们这四个当中有一个呢,诶从BD状态呢,变成free状态了,这个时候呢,你再去拿着这个链接去操作数据库。哎,只能如此,那么怎么就从BD到free的呢?就是当我们用完以后,最后呢,咱们执行了一个叫连接的诶close操作,这个close操作呢,咱们以前自己创建的连接呢,那叫诶释放内存空间,相当于你把这个连接对象呢就给清理掉了,但是对于我们数据库连接池来讲,你的close呢,只是相当于把它的状态由BC改成free这个连接啊仍然又还回到我们连接池当中,可以供其他的呃这个Java程序呢,再去获取,接着的去使用,诶就是这样的过程,这是咱们上午提到说你这个连接,当时咱们讲这个数据库事务的时候提过啊,说这个连接的话呢,我们在操作之前,通常呢,让它是set auto commit等于false。
10:28
就是让他呢设置为不要自动提交数据,诶那当你要把这个链接还回来的时候呢,这个设置的属性呢,还是一个false,别人要拿的时候呢,他可能会认为默认呢是呃,Auto commit是true的,所以接着呢,就我们在还回来的时候呢,记着把你这个呃连接点set auto commit改成true啊,让人家再恢复成一个呃自动提交的状态,以免呢别人用的时候呢,会有一个误解,因为咱默认情况下呢,都是自动提交的。哎,注意这个事儿就行了啊行这呢是我们说的这个连接的这个事儿,这个一说到天安门的话呢,一般大家这个你像我的一般朋友啊亲戚啊,就是如果要来的话啊,对第一反应就是先去天安门是吧,哎,他已经形成一个精神,不是条件反应,就是一个精神上的一一个一个一个象征一样啊呃,就是天安门呐,长城啊,颐和园呐,是吧,就是这属于几个啊对故宫在天安门这边一起嘛,就觉得属于一个必须要考虑去的地儿,你要这几个地儿没去,相当于北京呢,就白来了是吧?啊一般都是这种哈,那另外呢,就天安门其实也是一个比较相对来讲比较神圣的一个地儿啊,但那呢,你不能做一些乱七八糟的事了啊,这个想起来一个例子啊,当然这个考完研的时候是我们这个后来读研究生的一个朋友,然后他们呢,几个考研的研友啊,说当时考完研以后呢,然后精神压力一下子就释放了,晚上呢就喝了点酒,然后呢就去天安门那溜达是吧,溜达的时候呢,其实。
11:56
所有哥们可能喝的有点多哈,正常天安门晚上你会看着就是灯火通明,但是一般没有什么人,但其实里边有很多便异都在是吧?哎,平时白天其实也都有哈,只不过呢,就是你看着跟正常人一样,嗯,然后呢,他就看着没啥人,那有一个那个栏杆,然后他就越过那个栏杆,然后在那个就是人民英雄纪念碑附近就开始扯着嗓子就开始喊,刚喊了几下,从三个位置来了三辆车啊,就迅速把他就给包围住了,这们一看当时都懵了,立马就腿都一软,然后就跪到那儿了是吧,然后来了句说我爱中国共产党是吧,嗯,军也给吓住了哈,然后呢,他们几个就赶紧过去说啊这这哥们啥事没有,就喝多了是吧,刚考完研啊,解释了半天啊,没事了就走了啊,所以说去天安门的话呢,一定悠着点啊,不要做一些这个很敏感的一些行为啊啊行好那回过来,那么刚才呢,咱们就引入了这个叫诶数据库连接车。
12:56
了,那这个概念呢,应该哎不太难理解,因为我们前面已经有线程池这样的一个底子了,好,那么下边呢,我们就引入一下,看看Java当中我们提供了几种连电池的技术啊,看这个啊,那么具体来说的话呢,就提到这样几个啊,DBCPC3P0,还有这个,这个咱们包括下边这两个,这都不算特别常见的啊,还有一个叫德鲁伊,哎,咱们现在要讲的话呢,主要给大家讲的就是第一个,第二个,还有还有最后一个,第五个。
13:23
他们几个特点是什么呢?这个DBCP啊,啊,你要说一句话来说呢,就是它速度比较快,但是呢不稳定,那自身呢也存在一些bug啊,这个DBCP呢,属于我们汤K的这个服务器呢,自带的一种连接池技术啊,这是它的一个特点,然后C3P0呢,呃,当然相较于DBCP来讲就是比较稳定,稳定性比较好啊,当然相较于DBCP来讲呢,呃,速度稍微差一点,这就是相当于是你很难兼容的这样的一个点啊呃,那么harm的话,官方呢,推荐的是叫C3P0,在官方文档当中他明确写了这个点了。啊是这样的,然后呢,这样一个它呢,就是稳定性呢叫c.P0也要差一点,它呢是比我们这个DBCP呢还要稍微的快一些,就是各有特点,那么我们现在要用的话呢,主流都是用的德鲁伊,那就是它啊这个呢是阿里提供的一个数据连连接池技术。
14:15
那主要用的现在都是它了,它呢是集DBCPCDP0啊它们优点于一身,阳D呢,它既兼顾了稳定性,同时又兼顾了效率啊,就相当于达到一个平衡啊,属于这样的情况,那么咱们这块讲解的话呢,就是这三种呢,哎,都带着大家去讲一下,然后呢,主要开发中用的,我们就用第三种,那讲的过程当中,通过对比你会发现其实主要的套路是一样的。啊,套路是一样的,那么数据库连接池技术在这块呢,要想连接我们这块呢,也要对接一个顶级接口啊,在我们三公司这块呢,也定了个接口叫做data source data source呢翻译过来就是数据源,那它呢是一个接口,该接口呢需要由我们现在的这个服务器呢去提供实现啊,也有一些开源的组织提供现了,就是我们刚才说的这些,就点类似于我们前面说的那个一样,哎,要想获取数库连接,我们就从那个driver入手的,需要呢,诶各个输据厂商提供JA的这个诶实现类。
15:10
对驱动的实现类啊,诶这块呢,我们就从这个data so入手来看一下具体的这个,诶数据库连接池技术该怎么去落地实现。好,这个我们先停一下。
我来说两句