00:00
首先我们说为什么要有数据库连接池,有几点啊,第一点我们现在的话呢,我们获取一个链接,大家可能感觉获取一个链接很简单,我直接get connect方法就可以了,实际上当我通过这样的方式获取链接的时候,大家看啊看,每次都得。去上数据库里边获取一个链接,就是说我需要远程去连数据库,给用户名,给密码,拿到链接,那这个在。远程连服务,连远程连数据库服务器的时候,这是一件很耗时的操作,那是不是需要走网络呀?哎,这么好不容易拿到一个链接是吧,拿到之后用一次之后你就给他释放了,其实很浪费。第一个就是我们获取链接并不容易,我不能说我获取完一个链接是吧,然后就把这个链接给释放了,这样比较浪费。第二点,那我如果要是通过呃这样的方式去获取链接的话,比方说我有并发操作。
01:13
我们同有这个数百万条,呃,数百万个这个请求同时涌向我们的数据库服务器,那很明显数据库服务器能够同时用拿到请求是有限的,当有无限个这个请求到数据库服务器的话,这个时候数据库服务器是容易崩溃的,所以说我们也应该对这个链接有所限制。然后的话呢,我们希望我们获取的链接能够得到重用,哎,这就是数据库服务器存在的必要性。看传统的模式,按以下步骤,第一个在主程序里边建立数据链接,Circle口断开,这样的操作有很大的问题。
02:03
第一个问题啊,数据库链接没有得到很好的重复利用,如果同时几百个人甚至几千人在线的话,频繁的进行数据库链接将占用很多资源,严重的话会导致数据库服务器崩溃,对于每一次数据库链接循完以后的话呢,都需要给断开,否则如果程序出现异常而未能关闭,那这个时候的话呢,将会导致内存泄露,那这种开发不能够控制被创建的连接次数,如果系统会毫无顾忌的这个往外去分配链接的话,那这个链接过多也会导致内存泄露跟服务器崩溃,总的来说,我们现在这种开发方式呢,有很严重的问题,实际上真正进行企业开发的话,没有直接通过先前这个方式获取链接的,我再说一遍啊,真正。
03:03
因为真正进行企业开发的话,没有通过这样的方式一次一次获取连接的,一定都用数据库连接池,所以说我们讲这个jdpt to啊,目前是我们的这个1.0版本,我们回头还会对这个整个这个常用类来进行进一步的升级,进一步的重构,那这个时候的话呢,很多时候我们这个链接都需要来自于数据库连接池。好了,说说数据库连接池,为了解决传统开发中数据库连接的问题,我们可以采用数据库连接池技术,数据库连接池的基本思想实际上是为数据建立一个统一的。缓冲池。就是说白了就是我有一个缓冲池是吧,里边我放好了一定那个一定的数据库链接,我真正去获取链接不是上数据库服务器拿,而是上那个缓冲池里边拿,用好之后的话呢,再把这个链接还给那个缓冲池,这么一个意思,然后这个缓冲池去维护数据库链接,比方说维护,哎,我最多能够像数据库去申请100个链接,好了101个,你要是你要再申请的话,对不起,你等着,等那100个里边有这个什么呀,等那100个里边有这个闲置的,然后你才能连。
04:35
数据库连接值的基本思想是为数据库建立一个缓冲值,预先在缓冲值里边放置一定数量的连接,当需要建立数据库连接时,只需要从滚冲池里边取出一个,使用完之后的话呢,再放回去。数据库连接只负责分配、管理和释放数据库链接,它允许应用程序重复的使用一个现有的链接,而不是新建一,这就是我们说的这个数据库连接池。那么它除了我们能够缓冲存放这个数据库链接以外的话呢,它里边还有一些参数,比方说我们可以设置最小的数据库连接数,最大的数据库连接数等等等,以限制你对数据库服务器拿链接的这个数量。这个的话呢,等我们一会儿讲的时候,我们会具体说每一个属性都是什么意思。
05:30
好了,这就是数据库连接时,那基本模型的话呢,是这样,大家看一看Java application,这是一个Java应用是吧?然后的话呢,我可以啊,这块有个数据库连接池,这里边比方说有很多链接是吧,我写了四个是这个意思,然后呢,我可以诶像这里边去用一个数据库链接。如果我一旦要确实是用一个链接的话,这个时候就怎么了,这个为。
06:03
说呀,他是忙着的,下回我要是再申请的话,那就不能随警察了,好了,那如果我要是说什么呀,我要是说哎。不用了,这链接断掉了,它再恢复为不,它可以被另外的程序所重用。这就是数据库连接池的基本模型,就是在这个连接池里边提前放置一些链接,用的时候直接从链接值里边拿,不用的时候把这个链接债还回去。这就是数据库连接池,当然了,它不只是有这些功能啊,还有一些其他的功能。笔记本原理。啊,发一个请求,然后的话呢,获取链接,这个链接直接是什么呀?建立链接,管理链接,释放链接,连接,直管连接时去连数据库,中间加了一加了一层,这一层就是这个应用程序跟数据库之间的这么一层,叫数据库延迟。
07:16
数据库链接是有很多优点啊,资源重用,更快的系统反应速度,新的资源分配手段,统一的链接管理,避免数据库连接泄露,那这些的话呢,我们就不一个一个说了,在感兴趣的话可以自己来读里边的详细的这个介绍,好那我们真正开发的时候的话呢,我们不需要自己手工的来写一个数据库连接值,我们看一下。It。这是一个接口,这个接口的话呢,我们在这个,呃,JDK里边并没有提供实现,这就是数据库连接池,这里边会给我们提供一些方法。
08:05
那当然了,它有一个什么,它有一个这个副接口啊,副接口是这个里边的common data,那这里边会有一些方法,那我们要是写的话呢,我们不会自动,我们不会直接去写这个接口的时间内,因为什么呀?因为已经有比较嗯成熟的数据库连接值的实现,说阶梯BC的数据库连接值用Java X circle口data s来表示,这只是一个接口,该接口通常由服务器提供实现,比方说com里边都提供了该接口的具体实现,那实际上也有一些免费的,也有一些开源组织提供了实现,这个实现的话呢,主要有两个特别常用的,一个叫DBCP,一个叫C3P0,大家还有些其他的是吧,用法和这个都差不多,我们只要把这两个搞定了,再去学其他。
09:05
大的问题也不大,Data source通常情况下我们称之为数据源,它包含连接值和连接池管理两个部分,就是连接池是有的是吧?同时的话呢,我还可以来管理这个连接池,习惯上我们把data source数据源称为数据库连接池。好了,那具体我们就看看怎么用吧。第一个我们来说一下这个,呃,DBCP数据源。测试一下,就是这个,这是什么POS是吧。这。DB。带到说什么呢?使用DBCP数据库连接是怎么用啊,这个DBCP吧,同一刚我们说了是吧,这是一个开源的,我们首先需要用这个价包发了吧,Open source common,我们看BCB这个包是不是发了呀,发了吗安。
10:34
啊,发给大家,然后的话呢,我们打开这个DBCP1.4过来,是不是有个夹包啊啊。复制。是把这个放到价,然后呢,第一。他说,家暴。
11:06
第二部。加上这个药包之后呢,下一步是什么呀?我怎么用它呀。比较比较不爽的是什么呀,它只提供了一个这个APIDOG打吧带。等一下啊,这是个什么呀?哎,这是一个API的一个帮助文档,那如何来用它呢?创建创建数据库连接池,我们看到啊,我们现在的话呢,这个这个文档吧,看的有点恶是吧,为什么说有点恶呀,因为这个里边的API太多了,你怎么样让我找到哪一个是我要创建那个数据库连接时呢。
12:05
当然这里边它也有示范吗?DBCP现在要么在这里边,要么在这个里边,这不是什么叫什么data sources,那这里边的话呢,这个是DBCP,这里边也可能有,但是这个类太多了,一个一个看,不怎么靠谱,我们可以这么来写,大家看啊,写个data。South,注意这个别搞错了啊,这south等于no,然后呢,用CTRLT一下,我想看一下它整个的这个,嗯,继承的关系,我们需要上DBCP里边来找,里边有一个有一个最基本的是吧,叫basic data source,我们来创建一个试试来。对。推他等于六黑给他啊行啊,写好之后,写完之后的话呢,我们看啊,这个是哪个里边的,是不是DBCP这个包里边的好。
13:06
过来这个DBCP这个包里边有个basic data source在这呢,好了,这个选好之后的话呢,我们看它实现了一个接口叫commentate source,然后的话呢,它还有这个子类,我们看吧,有了这个以后的话,下个我们想干什么。你光有这个不够吧,光有这个起码你去连这个数据库,我还一些,我还需要一些基本信息吧,比方说设置用户名,密码,GB CL class这些他有方法吗。应该有一些赛方法。找找set可有什么啥的啊,Set什么,呃,这个set。Name写一下吧,来。Eagle。
14:02
创建DBCP数与。原实例第二个为数据原指定指定必须的属性,那所以属性的话呢,有一些可以默认的是吧,还有一些的话呢,必须得指定一些,你看这个造这么写也行,反正是吧,点点这么写不行,这为啥不行啊,那没有那些赛方法,那根本简单。点赛来。火连买色口这south.that pass,再来这个s.set GB CU啊,不要写g b curl,没有JDBC哈。
15:08
什么C买再来set fe in by。Com点买circle.c点这会写完,然后第三个必须的属性啊,其他属性的话呢,我们一会再说其三个从数据源中获取数据库链接,爽一下先啊,Connection等于data s点打印一下。三指有力场往外抛,你不管好了,先看一下这个结果。
16:10
坏了,他说什么?他说有个累没找着。看一下没找到什么类呀,哎,是不是command po啊,就是说我要是用这个DBCP这个数据源的话,我还需要导入一个它依赖的假包叫破回来。过这个里边可以发给大家一会儿哈,CTRLC它依赖于它。看进来哦。爱pass再看效果好了大家看哎,拿到了拿到了,我们看一下这个类啊,点爱拉。大家看这不是DBCP给我们提供的一个一个connection呢,没问题,这样的话我们就拿到了这个链接,那这里边还有一个需要注意的,需要注意的是这个依赖于依赖于。
17:15
或。破这个小包。依赖于破。好了,我把这个包的话呢,也发给大家。哎,这个里边的话呢,我们看一下这个具体的这个步骤哈,第一个加价包同时下包应该是几个价包,是不是两个价包啊。不够。
18:02
哪两个呀,一个是DBCD本身吧,还有一个是那个我依赖于它嘛,然后创建这个连接师实例,我们是basic data s,然后怎么样,我们设置了一些属性,三设指了常用的属性。四获取的。连接我们设置了,刚才设置了这一些必须的属性哈,最后我们还会来讲一些,呃,比较重要的,比较常用的属性,但是作为DBCB的一个hello world已经OK了,那大家把那个hello来写一下,一会儿的话呢,我们来看其他属性搞一下吧,刚才呢,我们写了一个关于dptvd hello word步骤啊,加两个加包,呃,创建连接池,呃创建连接是实例哈,指定必须的属性两个链接,嗯,基本上是写好了,那这里边的话呢,我们还发现一些一些问题,比方说第一个问题我们在。
19:17
这个正常去做我们一个connection的时候,就就是前面PPT tools里边获取链接的时候,我们是不是还把这个信息放在外边来,那这个写死了肯定不好,第一个第二个,嗯,还有还有一些什么可选的属性吗?三指定啊,数据源的一些可选的,可选的属性这些这些可选的话应该是这样的是吧,它不但可选,而且它们是有一定意义的,怎么看呢?看这个吧,大家看这里边是不是有N多方,是不是N多set方法呀,任何一个set实际上都是指定一个属性的,这些属性往前找在这看啊,这些都是属性,而且都是protect类型的,我们可以在这块去指定这些属性,比方说啊,指定它叫这个连接池,初始化的时候有多少个是吧?啊初始化化小好了,那我们不一个一不一个一个看这个了啊,我们来写两个,第一个。
20:41
指定数据库连接池中初始化。连接触达。给他solve.that in。
21:02
在比方说主始化是十个,我还可以指定什么呀,肯定还可以指定最大的连接数,就最多弄多少个data south and s mark,大家看max是不是有两个,第一个是active active应该是说最多多少个active,比方说我们说啊最多比方说是50个,那都是五,50个是什么意思啊,超过50个就不再有链接了,是吧,然后你就得等着啊,还有可以指定一个。最小链点数得塔S点。嗯。没有一个什么呀,它没有一个最小连接,它只有一个set me iol的iol啥意思?对,那感觉好像是空闲的是吧,有一个初始化的,还有一个命爱豆,我们看看吧,马克爱豆跟命爱豆不是这个这个嗯,马克呆走看看看这也可以啊,那是什么意思呢?说嗯,这是一个最大的一个数,然后connection可以在空闲的时候保留在临接值里边,是这意思吧,就是在空闲这个连接值在空闲状态下最多可以保留多少个连接,这个跟最大连接出来不一样,我们看最大连接数,还有一个什么面爱豆,它是什么呢?它也是说呃,连接。
22:55
实在空闲状态最多能够最少需要保留多少个链接,那我们刚才那个。
23:03
还有一个啥来着,有一个max active是啥意思啊,活动的连接数max a啊,他啥意思啊。这是你能够从连接池里边在同一时刻最多获取多少个链接吧,这不什么,在同一个时刻最大的链接数能向连接值去获取的,如果这个数是负数的话,表示没有限制吧,啊这个意思,他说最大连接数,这个最大连接数指的是同一时刻可以同时向。B。绿酷。身形的链接数,而这个呢?这个幂它是什么意思啊?这个最小连接数,这个最小连接数应该指的是动态数据库。
24:13
连接空闲状态下,空闲状态下,然后呢,这个连接池中。最少放少有多少个店有多少个?是不是这个意思,看一下啊啊m iol,最早的链接数活着的是吧?在连接值是空闲的,有这一块应该怎么读啊,在连接值里边说最少的活的连接数,它们能够被。
25:01
保存空闲的这句话是什么意思?这句话应该这么看,大家说这个意思是指我连接值连值空闲的时候最少的连接数,还是指?我连接值里边能够保存的最少的空弦连接数也不一样。什么意思呢?比方说我现在的话呢,我这个链接是没有任何一个请求,哎,比方说我保证了五个,然后的话呢,我这个时候我同时有十个请求,我有十个请求的时候的话呢,我这个连接值里边还需要有多少个,空闲的可能还是五个,那我们这个m iol指的是就说连接池空弦的时候最少多少个还是。呃,连接池里边得有这个最少空闲的链接数是多少?懂这个意思吗?是哪一个?看这个吗?这个that是修饰谁的呀?是不饰修饰这个connection的呀,叫啥叫什么定语从句吧,是吧?这个in是什么呀?是在数据库连接池里边吧,说在数据库连接池里边能够保存的空闲的这个活的连接能有多少个?所以说应该这么写,这个连接数理出了啊这连接值。
26:26
中保存的最少的空闲链接啊,数量,那我们指定一个吧,比方说我指定一个,这个时候好处是为什么要绑那么多空闲的,这个时候就是防止着你要再来链接的话,我可以第一时间把链接给你,这样那。用的常用的这个属性,第四个还有一个data data.set。
27:06
二。Eight。Long long好像应该是个什么东西啊,应该是个时间,就是什么最长的等待时间,啥意思嘞。看好不好数吧,是吧,说能够等待这个呃。这个连接值将等待一个链接返回的这个最大的这个毫秒数,如果要超过毫秒数的话,我就抛异常了吧,什么意思啊,也就是说我要向数据库连接池要一个链接。好了,那你要用链接的话,我得我得等吧是吧,我超过这段时间之后的话,还没有的话,那我就好异常了,就是等待数据库连接池为其分配链接。最长时间毫秒,1000毫秒乘以五秒等待数据库连接。
28:13
十。分配链接的最长时间,单位为毫秒超不干时间。先跑一场。行,抛出啊行了,我们常用的属性的话呢,我们只能用这样的几个,然后的话呢,可以从这里边来来获取,哎,觉得还行,那下一个问题就是我能把这些比方说十啊,50啊,五啊,包括5000啊,包括用工名密码呀,放在一个配置文件里边,当然可以,那可以的方式就是我们可以用我们以前的方式,我自己手工去读,我自己手工去读那个文件,然后的话呢,一个一个获取值当然可以,那它给我们自带了什么方法吗?我大家往这看还有什么呀,是不是还有一个data source connection factory啊,还有一个basic data source factory吧,看这个这个挺好,叫什么basic data source factory什么意思啊,是不是产生书据员的工厂啊,哎,工厂。
29:37
工厂就这个就是产生它的,比如说我们过来看这有什么方法,你看我创建这个的时候呢,是不是有一个什么不是啊,这里方是不是提供了一个静态方法呀,可以产生什么,产生一个data source吧,传入一个properties吧,那这个properties就是我们指定的那个properties,那这个properties可以怎么写呢?可以这么写来看。
30:03
Public avoid DBB south爱他,OK,对,怎么写呢?这么写给他。等于basic factor直接指定一个proper可以了啊,Proper从哪来呢?Proper我们可能得需要去找一个,然。Proper等于new,好,proper.hold依依旧是一个解吧。put stream in stream等于alo吧。
31:12
JDBC.class.at class。Load点。As result as stream这个名就叫DBCP.pro那这里边能够放的是什么呢?先拿出去把抛,然后的话呢。Exception。我们打一下啊,Get out get south.get on OK,写完这怎么写?CTRLC在src下创建一个配置文件,好写完好这个里边的话,你看我们写写它的时候怎么写的,是不是我随便写的,什么user password,什么gdb class是吧,不能随便写的吧,这个属性应该参照。
32:18
Basic data source的这个属性名跟这个一样,跟这个不一样,不行,那咋跟这个一样啊,刚才他刚才他已经写了呀,于是我们过来看看有什么呢?找U得内,注意啊,这个N是小写的,有得内等于。等于1230。对啊。
33:03
那这个看长这样,这长这么丑呢二。嗯嗯。对。Properties,好吧,来下一个driver last,他这么叫啊,come.circle口点金T。点在看是这样吗。Ul,下一个叫URL等于CBC circle,哎,对谷好,我们看能不能起来啊。一下没起来。
34:01
一点反应都没有,又贱。哦,红尘异常是吧。这个改过来,Proper再看。啊,获取着了,获取到之后的话呢,我们为了说明就从这里面来获取的啊,比方说我密码我多写一个。大家看这个时获取不着,他说什么呀,密码不对,是不是using pass什么是吧,密码不对,好了,这边来获取的,然后的话呢,其他属性一样写,这就是在我们前面我们讲张号B的时候,我们说了啊这个属性啊,应该是S方法去掉第一个字母变成小写,那C回来,这个指定为十第一个字母小写再来。链接数50,这个指定为下限。
35:11
最少的空间链接。命是0V5,必须要我来找找空间的。再来。最长等待时间等于五天。嗯,我看一下好没问题,没问题的话呢,我们还可以再进一步的测试一下,我怎么测试呢,我这样测试basic。等于。等于AS进行一个强转。
36:00
写错地方了是吧,在哪想转的。把X在这相转啊,A等于S进行一个强转标是什么呀?那我们分别属性two对打一个basic.at markx,我们设的是不是5000呀,看结果5000啊,用的的确是我这个配置文件里边的,好吧,其他的属性的话呢,我不指定了,大家要是需要的话,直接来看这个文档就可以了,一会儿的话呢,我还会给你发一个常用的一个汉语的文档。你也可以去参考一下。这块的这个步骤我们需要来说一下,步骤是这样的,是这样的拼方面的话呢,我们可以直接来创建这个basic data source,然后手工用通过set方法去指定一些属性名,然后get connection。另外一方面我们可以使用什么,我们可以使用工厂设计模式什么呢?一部创建。
37:24
从这个下载吧。下载文件。DBCP的配置文件,这里边我们需要说明一些基本的这个要求,要求是什么呢?配置文件中啊。中的电值。不是这个键点是什么呀,剑需要来自来自什么,来自这个类的这个属性。
38:07
来自他。属性必须的,你瞎写的话,他他不认识懂吧,这一他不认识在哪呢,在这呢,你看这边你看写这个就是basic data source,看到这样的一个语个属性,对来自于它好了,第二个创建,创建谁啊,创建basic data source翻。调用调用basic factor的。Great。方法创建贝塔实例。第三步,从。
39:03
So实例中获取数据库。一点点好,写完了,这两个步骤我们都说完了,大家看觉得是这个好啊,还是这个好啊,上面那个好,下面那个好,上面那个吧,为什么好啊,好处应该有这样的几个吧,第一个就是我是不是把这个信息配置到这个配置文件里边来更加的。灵活,而且呢,这个整个我创建这个data source的过程对我来说是透明的,我不知道你是怎么创建的,我也不想知道,我只要给我一个工厂,我把这个参数一传的话,是不是就出来这个get off呢,你看我整个我后边这个测试哈,这个测试。我整个从30行到38行,是不是并没有跟具体的data source实现类相耦合呀?
40:01
没有,我不知道你是什么,反正我从工厂里边的话呢,我可以给你获取出来,而这个的话呢,成本略高,我需要知道如何去创建,而且我还得一个一个赛的方法去设置属性吧,所以说这个更好一点。好了,那大家分别通过第一种方式跟第二种方式来创建一下这个DPCP,像我这样式的话来测试一下行吧,我们来测试一下这个最长的等待时间,这块的话呢,我设的是五秒,那我如何来设置个正长等待时间呢?我把这个初始化连接数啊分为五个,最大的也是五个,那我现在的话呢,如果我要是获取六个链接的话,23456,注意这是第五个,第五个的话呢,加上一个标记看一下。好,这个时候的话呢,我这个链接我是不是一个都没关呢?那我到第六个的时候,它会等五秒,五秒之后再没有链接的话,它就会跑异常了,大家看这是前五个,然后等五秒,五秒之后再没有分配链接,它就抛了一个异常,它是什么呀?时间到了是吧?太mouse时间到了,那好了,那我们如果要是在五秒以内把那个链接给它释放掉就可以,注意哈,我在五秒以内把那个链接给它释放掉就可以,那这个时候的话呢,我们得使用一个。
41:30
多线程的效果,我一个线程释放,一个线程获取,所以说这样写,因为。点啊,这是一个线程,然后这里面有一个什么呀,有一个方法。因为我是不是这边有个方法,方法是不是成体啊,然后的话呢,把这句话我我这样来写action。
42:08
啊,我用一个线程来获取链接。好,我一个线程获取链接,然后另外那个线程呢,释放链接,Connection,这个时候我们把这个链接起个名吧,最后一个链接为例啊,Connection,这个叫connection。然后怎么办?我让呃这个在一定时间内释放TRY,这么写点sleep,比方说三秒。三秒之后我让它干什么呀?让它释放链接,所以三秒之内我让它释放链接,叫connection to.close。
43:05
啊看效果,这这是什么意思啊,前面是不是打五个了,打五个然后的话呢,我有一个线程来获取链接,然后另外这个线程的话补线程,等三秒之后这链接释放了吧,这是意味着在五秒以内我这个链接能获取到吧,这个时候它就没有异常。123好了。好,那我如果要超过五秒的话,比方说这你要是写一个嗯五超过五秒了啊,你再看超过五秒的话怎么了,我在这个五秒以内,我这链接是根没根没没没获取着啊,他会抛一个异常都是什么呀,时间等待超出了,这就是我们这个max Switch。
我来说两句