00:00
我们刚刚讲的这个是批处理,下面呢,咱们再来看一下数据源连接池。我们再来看一下数据源连接池,那首先呢,大家得需要知道为什么需要使用数据源连接池。呃,是这样的,因为我们的best deal当中啊,我们去获取连接,我们每一次操作的时候都是。立即去获取链接。用的时候才去获取。那这样的话效率其实不是特别高,我们可以采取一种什么方式呢?当我们程序运行的时候,我们可以先准备,比如说我们先准备十个connection对象放在那边。然后什么时候想用的时候呢,我们直接去这个容器里面去取一个connection对象。用完之后,我们再归还给这个池子。那这个效率其实啊是比较好的。或者我们生活案例当中,你像图书馆。我们图书馆里面某一本书,对吧,我这个书我我我有三本啊,有有有三本这个书。
01:01
啊,这个叫叫叫钢铁是怎么炼成的是吧,好练着练的,可能不小心就练废了是吧,好。那么图书馆这个书啊,那如果某一个人。啊,如果说某一个人,他把这个这本书借出去了。接出去看这个,阅读这本书。看完之后,他是不是可以再把这本书再归还回来?那其他人是不是可以再继续把这本书再借出去啊?那我们这本书是不是可以达到一个重复利用的一个效果。那我们连接对象也是一样的。想象一下,我们现在是通过driver manager.get去获取连接对象,用完之后在我们这个方法里面,我们就把connection对象给close掉了。是吧,同学们,那这样其实效率是啊,其实资源是比较浪费的。所以呢,我们可以怎么办呢?我们可以先准备一个池子,这个池子我们称之为叫connection。叫连接时。啊,或者叫数据源连接值叫data source。
02:04
数据源啊,Data source指的是数据源,Connection指的是连接池。那么我可以先往这个容器里面,我可以先扔N多个connection对象。提前给你创建好,放在这边。假设现在我有一个方法,我需要用一个connection对象,那我就把这个connection对象拿出来直接使用。使用完之后再归还给池子。什么叫归还?归还就是把他的状态。由正在使用,再重新设置为空闲状态。空前就表示可以用吗?就像咱们图书一样的,它的状态,比如说可借和和这个叫已借出是吧。他的状态一样的道理。所以这样的话,我们connection对象就可以起到重复利用的这个目的了。啊,所以呢,我们的好处有两个。第一个响应时间更快。什么叫响应时间更快?我们以前和数据库通信的时候,第一步你要去创建连接对象,现在连接对象是不是你不要创建了?
03:07
哎,是不是他已经有了嘛,你就不需要再去创建这个对象了嘛,你创建这个连接对象也就意味着你需要和数据库建立socket的连接。想想是不是我们底层不是它不就TC pip吗?它进行socket的连接,那肯定一定是耗时的。啊,所以这个响应的时间会更快。第二个我们我们对象的利用率。利用率更高。以往的情况,用一次直接close,那就释放掉了。这个利用率太低了。现在我们连接对象的利用率会更高。因为我们执行close,我们方法还是close,但是我们close它并不是真正的把连接对象给断开,而是把它的标签,把它的状态设置为空闲状态。那行,咱们下面一起来看一下代码怎么来写。
04:00
呃,我们这个数据连接池的产品啊,比较多。啊,有很多。比如说有DBCP。有C3P0。You,还有一个叫Bo cp,还有一个叫Joy。啊,咱们现在可以使用这个Joy的数据连接池。如果你实在不想使用这些,你自己写个数据连接时也是可以的。啊,数据连接值就是一个map。他就是一个卖法。K value可以value吗?对吧,那个这个,那那那你这个value不就是这个连接对象吗?当然不能单纯的把value里面放连接对象,因为我们需要去需要去对connection,需要需要去对连接对象的状态,需要去做一些维护。所以呢,我们放的这个value,这个对象呢,是我们connection的,呃,又一层的封装。啊,但是不管怎么说,它核心它肯定是一个map。啊,卖盘就是个容器。然后我们可以通过一个后台线程去监听,去维护这些对象的一些状态。哎,就是这样的。
05:01
啊,所以说大家如果感兴趣,课下可以去看一看,我们这个数据源连接池,如果让你自己去写的话,你的思路是什么样子的,大家可以去看一看,网上有很多的资料啊,因为这种之前是咱们企业,呃,面试题的时候经常会问,对吧,数据连接时你为什么要用啊?啊如果说没有现有的数据连接池,让你自己写一个,你的思路是什么呀?你大概需要注意哪些方面啊?那咱们下面就来看一看它怎么去应用啊,咱们就使用这个叫德鲁伊。咱们试试看啊。呃,我们先找到library。在这呢啊Joy ctrl c拷贝一下,放到我们,放到我们项目里面去,放到这个library里面去,CTRLV把它粘进来。好,这样我就把它粘进来了。嗯,粘进来之后呢,我们来试试啊,我这边写个零二。代码零二。是一个叫教育的。我们这边写个慢方法好了。那我们怎么去操作呢?首先第一个data source。
06:03
你看一下Java xx表示扩展包。JDK的扩展包叫加YX。好,Source等于new Joy的source你看。这是我们阿里巴巴提供的。啊,6JOY的dinosaur就是它。然后呢,我们可以给他去设置各种各样的参数set,比如说driver,稍等一下,我把这个名字直接用这个子类类型。啊,不用接口类型,直接用子类类型啊,这样能点出一些属性,点set driver,你看是不是有啊driver name。那这边比较简单,Org.GJt.mm.MYs.Java是不是设置一下驱动啊。再来点set u2L。JDBC意思一下啊,我不写了行吗?直接拷贝行不行,同学们。我直接拷贝了啊。好,从这到这P处理,最后一个标就C。
07:02
把它放在这。好,这是我们的药油。再来。第三个data source.set user。好,叫username。那么username我们就写个叫root,嗯,再来个source DA source.set password。123456那行啊,这样的话,我这一个data source就有了。然后点它有个方法叫get。我们试试看它能不能给我们获取到连接对象。好,我们用一个connection把它接收一下。我们试试看。Sloth。就抛到外面去算了啊,然后咱们这边来打印一下connection。我们看一下这个连接对象能不能打印出来。运行。你看是不是有的呀。
08:01
啊是有的,这边报了个严严什么什么什么严重,不管他行吧,这不管他啊。这个对象,总之我已经打印出来了。没错吧,好,下面我要给大家验证的是什么呢?我反复的去获取连接连接对象。看他获取到的是不是同一个。啊,咱们也可以来试一试。嗯,这是一个connection对象。然后呢,稍等一下啊,我这边把它改一下啊。这是第一个CONNECTION1。Can you see。Connection。给他减三,我获取三个。Can you see。我这边做个判断。我做个判断啊。If。嗯,做个什么判断呢。我做一个什么判断呢?比如说。
09:01
比如说啊。上面我获取了三个连接对象。负循环。Int I等于一,I等于零也行吧,I小于五,I加加。割裂对象简单一点。啊,把它挪进去剪切,我负循环,我每次是不是就创建两个连接的对象,然后把它打印出来。好,我在这边,我这边做个操作啊。If i100分号三等于等于零,如果I能够被三整除,如果能够被三整除。啊,余数为零嘛,那么我们就执行connection一点。然后2.close,我们就把它关闭掉行吗,同学们。我们就做一个关闭的事情。啊,这个代码这个大家不用去理解,具体这个老师这个写的是啥意思也不用管,总之我负循环里面,我一上来我就获取连连接对象,然后把它的哈code值打印出来,那么我这个二循环,当我循环能够被三整除的时候,我就把连接对象关掉,那请问一下,如果不不为三的时候,是不是他也不会关啊。
10:03
好,我试试。我们在这边设个断点。好,我们点一下debug。来,我们一起来看一下啊,往下走。往下走,CONNECTION1。Connection on。反应。一和二。76D和505再往下走。执行了吗?啊,零的时候会执行是吧,那行吧,再打印,注意看啊再打印。诶,你看。50576D,是不是第二次我去获取连接的时候,他又给我给两个重复的了,是吧,同学们那说那就说明什么,刚才咱们不是把它掉的吗。哎,你感觉好像是关闭,其实人家并没有关闭,我说了这个关闭是把他的状态重新设置为空闲状态。重新设置为可利用状态,能听懂吗?再往下走。这次我们再获取,你看一下他能不能获取到这俩对象了,刚才咱们if没执行,因为二等一。
11:06
不一样了吧,再来现在I等于二会执行吗?不会吧,所以说不也不会close,再来,再获取俩对象,你看。是不是还是不一样,哎,怎么不重复了呢?之前的是不是没有关,它一直一直他一直是不是被占用啊,一直没有关,那行再来这次I等于三了吧。I等于三是不是这两个会关掉,也就意味着这两个是不是会关掉。再执行获取。打印这两个你看。看到了不?刚刚关闭的是不是就直接你又获取的时候,他就直接把关闭的这个又给你了。键是不是就能重复利用了。这个案例你不要看这个代码老师这个代码有什么实际的含义,它没啥实际的含义,稍微有点绕佛,就往里面放了一个if。那表示有些连接对象会close,有些连接连接对象不会close,我想证明的就是B执行close的对象再次获取的时候还是能够获取到的。
12:05
是吧,同学们,然后咱们有部分connect对象没有执行close,那是不是就哈,就不会再重复了。现在能反应过来了吗,同学们?这就是连接对象。看还没懂什么意思啊,我错了,我说慢一点啊。这个负循环啊,我们想证明两点,证明两点。第一点是。被啊,被close,被close的连接对象。连接连接连接对象。连接对象并没有真正关闭。啊,并没有真正被close的对象并没有真正关闭,而是将。状态设置,重新设置为空闲状态。
13:01
然后放回池子。位池池子这样。这样的话,我们下一次啊,下次获取连接对象,这个对象会被重复使用。是不是?会不会重复使用?这第一点。第二点是没有被close。Close的连接对象。没有被close的连接对象会被一直占用。是不是,那么下次继续获取,继续获取连接对象。是不会获取到这个的,获取到这个对象的。是吧,同学们也就表现为哈扣。没有重复。是吧,只出现一次是吧,同学们,咱们只打印了一次嘛,哎,是不是现在应该能反应过来了吧。现在再再问我啥意思,我就哭了啊,好。
14:03
所以你会发现,我每次当这个条件符合的时候,我才把这两个对象关掉,那么如果不符合的时候,我获取了两个对象,是不是就没有关啊?你就会发现没有关联对象它的哈code只会出现两次吧,啊,只会出现一次吧,是吧,同学们啊,就是这样。这是这个案例。啊,没关,它就没有关嘛,他就一直占用着嘛。什么什么问题。呃,重新指向没有问题的。没有关系的,垃圾回收器它的优先级比较低啊,垃圾回收器发现某一个对象,如果没有人指向它的时候,它会把它释放掉,但是如果咱们说的严谨一些,即使你这边CONNECTION1,即使CONNECTION1被重新指向另外一个对象,我们之前的对象也不会被释放,为什么?因为之前那个对象我们在map容器里面还有其他的指象。
15:01
很简单,举个例子。举个例子。垃圾回收器是什么呢?这是一个对象,这是个气球。啊,咱们有个人在这边放气球。那么一旦这个气球,一旦这个气球断掉了,这个线断掉了。那么你这个气球是不是就飘走了?是不是也也就意味着他会被垃圾回收?能听懂吗?现在情况是这样的,同学们。现在情况是这边有个对象。原始情况下,原始情况下我们有个线指向的。现在我们有个CONNECT1,这根线是CONNECT1。这个线叫一。然后现在我们的操作是你把这个CONNECTION1这个线去掉了,把我们这个CONNECTION1重新指向第二个对象。便宜是吧?同学们是不是指向他了?那我问你这个对象是垃圾吗?
16:00
他是垃圾吗?不是还有个线还直向着呢,这根线是我们那个连接池里面的map容器直向的,能听懂吗?也就意味着这一个对象,这一个气球有多根线牵着的,这个对象什么时候成为垃圾,所有的线都没了。所有的应用都没了,是这意思吧?啊,因为这根线是之前连接时就已经引用它的是吧,所以说它不会成为垃圾啊。手动不可以的。不可以的,对,是不可以的啊。但是我们说了,我们刚刚这个代码,它没有什么实际的含义。按道理来说,咱们应该要养,养成好的习惯嘛,你这个对象,你或许你用完之后,你得把它扣子啊。是不是我这边就是故意的,当他为这个条件成立的时候在克嘛,那总归有些对象没有关闭嘛,没有关闭它是不是就一直处于正在使用的状态啊,所以说咱们就验证的目的就是获循环再次获取,永远都会都不会获取到那个正在使用的对象吗。
17:01
是不是同学们,咱们本来就是想验证那个嘛,啊OK。然后连接值,咱们再看一下其他的一些知识。我们这边的属性比较多,但是大家千万不要去死记硬背,千万不要去死记硬背,比如说我们有URL username password driver class name,这些都是比较常规的。然后还有一些initial size。Initial初始化。Size大小。这个指的是什么呢?叫初始化大小,我这个连接池啊,我这个容器啊,我到底默认情况下,当我的系统启动的时候,我的连接池也要把它把它准备好,那我到底要准备几个连接对象放到我这个大的map里面去呢?哎,这个叫初始化大小。那这个值没有标准答案,同学们,这是根据我们系统的业务情况来的。啊,一般情况下这个值也不会让大家去设置的。一般情况,项目经理早就给你设置好了,你不用管。
18:02
啊,一般我们都不需要去管的。就像什么,就像你这个这个这个这个。卖早饭的是吧,你这个卖早饭的这个点啊,一个餐点,早餐点在这边。是吧,你知道这个某一个时间点是大家上班的高峰期,那我这个做做这个手抓饼是吧,我是不是得默认情况下,我先先做20个放在那边。我做20个放在那边,至少是前20个人过来买的时候,他就不需要等待了嘛。能听懂吗?这叫初始化大小。啊,这个叫初始化大小,就这样子,默认情况下我池子里面应该拥有多少个连接对象,这叫一定S。你猜一下呗,这个initialize这个属性,如果让你自己去去写这个源代码,你怎么去写。不就是负循环吗?I从零开始,I小于一定需要,然后在循环里面就每次get connection get connection。需要size写十次,那就get connection调用十次是吧,同学们。调用一个扔到map里面去,调用一个扔到map里面去是吧,同学们啊,就是这样,OK再来。
19:05
下面一个叫,下面一个叫max active。叫最大的连接数量啥意思?容器里面默认有十个。嗯,十个连接对象被人家一瞬间全部用掉了,第11个人过来没有了。没有怎么办呢?我们连接池说别急,我现在立即给你再去获取连接对象,所以我们这个map它会进行扩充。默认我有十个对象,第11个人过来,发现没,没有用了,没用怎么办?连接值创建第11个连接对象。能听懂吗?创建第11个连接对象。Now。这样的话,如果说没有了我就创建,没有了我就创建,那如果别人是恶意去攻击的话,有可能会造成我的内存崩溃。因为对象越来越多嘛。总不能说我需要100万个连接对象,你也给我创建100万个吧。所以说我我得设置一个叫上限值,叫max active。
20:03
啊,我最大允许有多少个,比如说最大我允许允许有20个连接对象,所以第19个人过来没问题,第20个人过来也没问题,那么第21个人过来的时候。那这个时候连接时不行,我的连接数量已经达到我的上限值了,怎么办呢?说你等会儿呗。那这个在哪里设置的呢?叫max weight。说让你等会儿。等到什么时候,比如说max weight,我们比如说设置为2000毫秒。也就是说,等两两秒钟。那如果两秒之后,前面的20个连接对象还是没有人释放连接。还是没有人给我归还连接对象,那这个时候我就给你说一句,你不要再等了啊,就报一个叫timeout一个错误。报一个超时的错误。咱们一会儿可以来演示一下行不行,同学们。啊,一会儿给他演示一下。这里面的配置很多啊,大家没有必要说把每一个都要机器用,没有必要啊,没有必要比如说。
21:03
比如说这个叫命ideal,叫最小的连接值,里面的对象的数量叫命L。这什么意思呢?就像咱们开饭店做生意啊,开饭店啊,开饭馆是吧。嗯,命idea指的是我这个饭馆,我至少得批。叫叫叫叫叫,招一个厨师嘛。那我这个命挨掉,我生意再怎么不好,我得有一个厨师,得招一个厨师。Max ideal,他指的是什么?我生意再怎么火爆,我最多只能招八个厨师,不能再多了,再多可能我的成本这个这个利润率可能就下降了。啊,这个叫最大的以及最小的。没问题吧,所以说你看这边还有叫max active,叫最大的连接数量。啊,这个max可以不看啊,看这个max。啊,不管我生意有多么的火爆,我最多我只能有八个厨师,就这意思。
22:00
不管你这个连接,你请求我的次数再怎么频繁。我的这个容器里面,我最多只允许有八个对象存在。这叫上限。那命它指的是下线。再怎么没有人连接我,我再怎么清闲,我至少也得准备着有三个连接对象。放在这边备用着是不是同学们?哎,就这意思应该好理解吧,啊,应该不困难啊。哎,它会自己去释放。他会自己去吃吗啊?那你想想,如果让你自己去做怎么做,无非不就是一些县城吗?我这个线程什么事都不干,我专门我专门的去扫描,扫描我这个,呃,扫描我这个容器里面有多少个连接,连接对象存在。然后我每次我都会记录这个连接对象上一次是什么时候使用的。如果发现我们这个连接对象长时间不使用,而且这样长时间不使用的连接对象比例达到百分之多少,那就表明当前这个我这个容器里面对象太多了,我应该要释放掉30%等等等等。大家能想象出来吧,如果让我们自己去写的话,我们就可以按这样的思路去写。
23:04
啊,OK。那我们刚刚是直接啊,刚刚我们是直接在代码里面,我们去设置这些参数的。啊,稍等一下啊,我来给大家演示一下超时的问题,稍等一下CTRLCCTRLV。零三。嗯,我这边有一个,然后呢,我来写一个啊带着S。稍等一下啊,Source set initial size,默认情况下,比如说有两个吧。啊source.set max active是不是最大激活数量五个行吗?同学们,最大激活数量有五个那行?再来,我再设置一下你的等待时间,最大的等待时间max weight。Ma就是它好。呃,比如说等待时间,比如说我写个五秒钟吧。最大等待五秒钟,那行。
24:01
下面这些我都不要了,这个把它删掉,负循环2.0I小于十。循环十次,每次获取一个连接对象,获取到之后我就把这玩意打印出来,但是打印完之后我不close。行吧,同学们。打印完我不close。啊,我这边我要不要用个线程把它稍微停停一下呢,停不停结束无所谓啊,试试吧。看一下啊。嗯,这个连接这是connection,我在前面把它这个I的值把它加进去啊。要不然大家看不清。行吧,同学们就爱循环的次数嘛啊。来运行一下啊。运行。你看一下,它默认是两个,但是我最大是不是到四个了。哎,就这样啊,默认的四个,哎怎么报错了呢?为什么报错了。
25:00
Timeout exception是不是超时了?Wait,你看这个叫。最大等待时间是不是5000啊,就五秒钟嘛。激活了五个啊,我最大的时候激活数量是五五个,就这样。所以你就超时了嘛,所以你看一下我打印的这个I的值。零到四五是不是没打印出来,第六个没打,因为没有人释放,因为没有人释放,前面是不是五个对象都没有被啊。所以大脑后面的人过来就不行了。应该好理解吧,同学们啊,就这样子,OK,再来。我们的这个数据连接值,一般情况同学们一般情况我们不会直接调用这些set方法,一般情况下我们都是把这些内容啊,把它配到配置文件里面去。我们都是把它写到配置文件里面去。所以咱们一起来看一下。现在呢,我在SC下面,我来新建一个文件。我新建个叫JDBC.pro。Properties还记得是啥不?
26:02
Proper。这是个属性文件KY6KY6吗?我们我们的集合当中是不是有个叫。Property是不是就属于map集合?看一眼。写在这吧,Property。你看是不是加点影厅里面的。来点进去看一下,你看它和map是什么关系,他是不是继承于哈table。那哈,是不是实现了map接口。是不是同学们说明我们的pro是不是也是K8的形式啊?只不过这个properties呢,咱们一般用于存储,比如说我们k string string啊,K和咱们都用于做string啊,这个比较简单。那行吧,咱们现在回归到主题上来,我说了,我们一般情况下,我们不会把这些内容把它硬编码,这叫硬编码。写死在Java代码里面,这叫硬编码,一般像这种配置的信息啊,我们专门放在这个文件里面。这不是个Java文件,所以呢,它不需要编译,你有改动之后不需要重新编译。
27:04
啊,它的好处是这个。那行。呃,我就把这些信息呢,把它写到我们这个里面,那这个key呢,大家需要稍微注意一下啊,稍等一下啊,我先来写一下JDBCJDBC点点点点点点driver。Driver class name。啊,这个名字其实挺长的啊,一会儿我来百度一个,我直接用别人的复制粘贴啊。我咱们暂时先这么写。DBC点第二个是121。嗯,要有拷过来吧,从这到这。他过来。呃,第三个是GDPC.user name等于root。JDBC.password等于123456,老师,你为什么前面总喜欢加个JDBC点?不加也行。不加也可以,哪怕你写个abcd点都可以。这没有要求行吗?同学们,只是我前面加个JDBC,给别人的感觉就是哦,估计你这个后面配的这些value流值啊,这些内容估计都是和JDBC访问数据库有关系的。
28:07
别人看到的名字,大概就能猜到是啥意思了。行吧,同学们啊,就这样子好。好,那么这四个属性我把它配好了,当然也可以配其他的属性。比如说这个初始化大小最大以及最大等待时间,咱们把它配一下,比如说JDBC.in size单词我随便下写的。啊,初始化两个吧,JDBC.max active。白鱼。五个吧,JDBC.max weight啊比如说五秒钟接这样呢,我写一个配置文件。然后。稍等一下啊。嗯,这没问题,这个也没问题,我再来写代码零四,代码零四咱们就不是不是直接硬编码,而是去读取配置文件。
29:00
我们写一下啊,这个是用来验证连接池中的connection。可以重复使用是吧,同学们,这是我们代码零二验证的代码零三。我们做的事情是叫设置啊,就是验证连接池的。各项参数。初始化大小。最大激活。数量。最大等待时间是吧,同学们,我们验证的是这么一件事情,好,代码零四里面我们写一下。我们要验证啊,就是从外部读取。读取外部的配置文件。啊,配重件。配置文件叫读取外部的配置文件,设置连接池。所以呢,我们需要搞一个pro文件pro pro pro就是它pro等于它是怎么创建出来的呢?六六可以吗?我溜一个。啊,看一下它应该不是抽象的啊。
30:02
他不是抽象,那没问题,又一个。然后呢,咱们可以通过proper点漏,我记得哎,它有个漏的方法。漏表的加载吗?哎,架子里面需要个留诶。它里面需要个流,需要个input stream这么一个流,那这流怎么获取呢?没问题,可以获取input stream。等于六,本来我正常情况是new file,本来应该是这么去写的,但你这个new file呢,因为咱们当前的项目啊,它将来的路径是不固定的,我现在是我当前我自己的机器,我开发,我可能放在D盘,放在什么地方,将来我的项目是不是会部署到服务器啊。所以咱们最好不要通过文件路径去读。啊,我们怎么去做呢,好。04JOY的点。或者直接这样吧,啊,Get class。这边是麦函数是吧,麦函数还是个静态的啊,代码零四我这么写吧。代码04点。class.get class。
31:00
嗯。点get resource。Get class的。稍等一下啊。写错了啊。Get class啊,下面叫get resource as stream。这个表示的是什么?这个表示的是从我的类路径就是SC下面去读。剧毒的配置文件。好,GBC点。好,咱们来试一下,看这文件能不能读到啊,当前的方法是慢函数,比较特殊。将来我们不在卖函数里面写这个代码,那这边还会要变一下啊。先不管它,咱们先这么来写,我们试一下把它椅子把它放进去。那么思路一下。好,我们试一试,经过它之后,我们看一下这个properties里面数据,看它到底对不对。啊,第一步咱们得看一下这个流是否为空,为空就不行啊,试试吧。点它debug。好,往下走。我们先看这个流能不能获取到。
32:02
你看这流是浪,浪就不行行吗?同学们浪的话就不对啊。因为咱们当前是这个是卖函数。慢函数啊,它点。点get class load从内加载起啊。获取一下内加载器,然后咱们再再操作。再点他。把这前面这个get class去掉啊。在执行,因为慢函数比较特殊啊。再往下走。哎,你看这次是不是获取到了叫buffer input stream是吧,同学们,那这样我再执行load。好,我执行完漏,请大家把这个pro打开。是不是有啊,GDBC叫initial,是不是有了URL,是不是也有了user name password,哎,都都举到了吧。总有七七,对啊,七个建制队,那大家想想,既然你全部都能读到了,我下面在set的时候还要写死吗?不用吧,是不是直接从property里面去获取就行了,那行,咱们继续。
33:05
下面的就比较简单了。所以这个地方。proper.get那就get property呗,第一个JDBC点,呃,第一个是叫什么。拷贝一下吧,给就。到这边来点。Driver class name,我就把它写进去。再来set URL。塞12L,我们也来写一下,这么长不需要啊。好proper.get property,好JDBC.U2是吧,同学们。好,再来点get proper。好,GBC.username。再往下一个property。点get好。GDBC.password。再来,下面咱们也写一下。体验get property。JDBC.in我记得是叫in size。对的吧,一年的上也是对的啊好。
34:02
诶,这边报错,报错是因为他获取到的是死菌。能能听懂我意思吗?Get,返回的是死他需要的这个数字,诶。哎,是吧,同学们。强转一下不就完了吗?相准一下啊。那么下面也是一样的,枪转一下,In take.pass proper.get property。接BC点这个是叫什么max active是吧?下面给你写一下啊,你第一个点pass好,点get a好。JDBC点这个是叫max weight。有没有E啊,好像没有E吧。Wa没有啊。好,就这样。是吧,那咱们现在再来试试看行不行,行不行,不行,同学们,咱们再来试一下啊。那你想想,有人说老师,我感觉你刚刚写的代码比这个简洁,你这个搞了一大堆,这个太复杂了,但是它的好处是什么,同学们?是不是这边代码比较灵活,我这边代码是不是不要操作。
35:02
你要想切换不同的数据库,你切换不同的架包,我是不是这边代码不用动,我是不是只需要去修改这个配置文件就行了。没错吧,同学们啊,就是这样的。这个怎么还是灰色max?难道没读到吗?对的呀。GDPc.max。对的啊,变灰就变灰吧,咱们试试啊运行,只要他给我运行到第五个报异常timeout,那应该就说明生效了是吧。试试啊。你看第五个停在这边了。然后一会儿会报错是吧。哎,报错了吧,那说明没问题啊,说明这个效果也是也是可以的啊,说明这个文件他确实读到了。那这些API大家不用记啊,API千万不要去死记硬背。咱们坚持一下下啊,现在12点。嗯,在我们这个,我看一下啊。
36:00
在我们。T a sauce。稍等啊,我看一下点。我记得他有个叫漏的,他没有漏的吗。Set。Property。这个好像没有啊,嗯,但是我印象当中我记得是有的啊。还有一种更简洁的方法是什么?没有必要自己去一个一个的设置。没有必要自己去一个一个设置,稍等,让我想想。我在这边写一下啊。嗯,Joy的,我看一下啊,第。Did dinosaur factory。Factory。策略点。你看同学们。是不是有个叫C的dino so?它里面是不是就直接扔一个properties。哎,这个应该是比较爽的是吧,那行。大家让我拖档一分钟啊。我再重新新建一个。代码零五。
37:02
回到这边来。好了,首先我们这边有个practice对不对,这第一步是不变的这一步啊,你这个data source你怎么去创建呢。我们可以通过join。That factory。点create data,然后里面有一个是吧,然后我们把这个叫proper,把它扔进去。就可以了啊,思路是一下。然后这些步骤是不是都不要了啊,他给我们返回的是一个data source,你看。它返回的是data source,所以这个不要用子类啊,用这个source就可以了。就这样子,然后这一坨是不是都不要。然后我们也一样可以打印。但是一个前提,同学们。这样的话,你这个pro文件里面就不要瞎写了。他这边K,你想想他怎么可能那么神奇呢?说明他的key是和你约定好的是吧,我不保证这边写的对,所以我得百度一下。因为这这玩意儿实在记不住啊,稍等一下。
38:12
百度点错了啊。好,我们写个叫Du I。Joinid,然后proper。就他吧,第一个。哎呀,这个。我也是醉了。嗯,这么简单吗?啊。不能复制吗?这个非得要登录是吧,这个有点无耻啊,我偏不登录。那行吧,我重新再来写个profit行不行?同学们,我这个就不改了行吗?我重新再写一个啊,写个叫GDBC2行吗?同学们。然后在这里面我们把它改一下。
39:03
第一个叫driver class name,大小写不能错啊,大小写不能错,Driver class name。第二个叫121。第三个叫user n是小写。下面叫password。座的不是PWD。下面是initialize。Initial size。帮我看着,下面叫max weight。Max max wait,行了吧,同学们。这样我就把它配好了,不能写错的啊,这个不能写错的,好,GDBC2,然后咱们再回到这里面来,我们读的应该是GDBC2是吧,同学们咱们试试看行不行,运行一下。应该问题不大,读到了吧,然后等五秒,他应该报错,那说明是可行的,假设我写错了。假设,比如说username,我这个N写的大写,同学们你看一下。
40:01
我把N故意改成大写,我们再来原形。点一下运行。他就获取不到连接对象了啊,因为人家K是固定好了嘛,是吧。没问题吧,他就报错了啊,说我们的这个这个用户名不对是吧,User不对啊,叫delay叫access访问被拒绝了。好,这个是我们讲的叫数据源连接池。那么上午呢,我们就就说这么多。
我来说两句