00:00
好,下边呢,我们写工具方法。Public static connection。Get connect,哎,这个呢,它就是专门用来啊去这个。呃,返回数据,返回数据库连接对象的一个方法。获取数据库连接并返回啊这个方法。这儿有一个问题,刚才我们谈到我们拿到数据库,拿到数据源以后,哎,不是将数据源绑定到本地现场啊,是将这个数据库连接。是这么说吧,从数据源获取到数据库连接后啊,诶绑定到绑定到本地线程。
01:00
三。那这个为什么要绑定到本地线程上面呢?为什么还要用到一个thread local这个对象呢?哎。嗯。在这哈,我们说。这个thread local,我们之所以要借助这个对象呀,是因为呢,我们控制事物的一个需求。啊,控制事物的需求,呃,我们将来呢,这个应用程序在写的时候,它一定呢,是需要有这个事物的啊,哎,就是说一个。Service方法啊,业务逻辑层的一个service方法里边呢,会有可能会执行好多个SQL语句。有可能会执行好多个搜狗语句,哎,那么你们你执行这些个搜狗L语句呢,其中难免有某一个会会会会失败啊,比如说有成功的有失败的,那么这个时候如果有的成功,有的失败,有的提交啊,有的这个没有提交。那么这个时候呢,他这个数据呢,就会发生错误,哎,所以我们得保证呢,他们要成功一起成功,要失败一起失败,要一起全部都成功的话,就提交事务,要失败的话,有任何一个失败啊,有任何一个失败,我们就回滚这个事务,保证这个事,保证这个数据的正确性,那我现在怎么去保证我这个事物呢。
02:20
啊,我怎么去保证我这个事物呢。哎,我们现在呢,给大家就直接说我们最终的这个方案哈,哎。啊,这这个地方这儿说了一个,说是在一个方法内控制事物,那我们在这儿来举个例子吧。嗯,说哈。就是说我们用JDBC的方式呢,我们来控制事物是这样的。
03:01
这儿呢,其实我也是要求大家这部分是你是会的啊,然后我只是呢,呃,简要点说一下啊,去串一下和你和你的这个认知呢,去做一个对接啊,那这个肯定不能够像这个我们讲GDBC的时候,完全详细的去讲这些这些内容啊。呃,我们。单纯的说,如果就只是从JDBC的这个语法层面上控制事物的话,它有这么几个操作,首先第一步呢,我们要获取数据库连接,这里边儿其实有一个很重要的一个点。就是一定要保证。参与事务操参与事务的多个数据库操作啊,也就是我们搜狗语句啊。要保证他们使用的是同一个数据库连接。
04:03
道理很简单啊,因为我们获取到数据库连接以后。叫get connection哈,我先把这个先写完,哎,你获取到数据库连接,哎,将来呢,这个你要去第二步,这就是执行这个核心操作啊,我这儿就先省略啊,因为这儿不一定是什么核心操作,第三步的话呢,就是如果在踹块里边核心操作正常执行完,能够执行到第三步这个地方,说明没有抛异常,没有抛异常呢,就说明核心操作,哎成功结束可以提交失误,哎成功了就提交失误,你看这个我们提交事物呀,它是拿这个connection啊,数据库连接对象来控制的,如果呢,核心操作抛出异常。那么我们就必须呢,来回滚事物。
05:06
是吧,然后呢,最后呢,在最后这一步啊。第五步啊,然后在这呢,我们要做的一个操作就是呃,释放数据库连接。当然前提呢,这个时候是说哈,严谨一点说,Connection说它不等于闹。嗯,啊,其实这个不需要在这儿判断哈,对这个不用在这判断,呃,我们在这个工具方法里边来判断。Release。呃,释放当然不是真的释放,而是标记为空弦啊,只是给它标记为空闲啊,当然把我们这个connection对象给传进去,哎。就说呢,这个地方我事物的提交和回滚全部都是由这同一个connection对象由他来控制的,所以这个时候呢。
06:10
肯定哈,我们必须得保证这里边儿的所有的操作用的都是我这儿获取到的这个链接啊。那么因为这个原因。哎,我们这等于说写的是这个伪代码。啊,如果说在一个方法里边呢,去控制事物的话啊,你想在这个service里边,我们每个service里边都要去写下边这些代码,那肯定的是很多重复的代码。哎,那么啊,这个代码。这个重复性就太高了啊,我们不希望没有必要写这么多重复的代码啊,我们希望还是能够把它们给抽取出来。
07:02
然后呢,那你说那我能不能把它们给封装到do里边呢?啊,你要写在每一个do方法里边呢,这不还是重复的吗?而且呢,每一个do的方法哈。每一个基本上一个do的方法里边是执行一条SQL语句。而这个service里边呢,要放到一个事物里边的,它有好多个do的方法啊,统一的放到一个事物里边,所以说呢,这个时候啊,就是说至少要放到service里边。那么你不管放service里边还是放service里边,其实都是这样的重复的写法,我们不希望这样重复的,我们希望能把它抽取出来,抽取。呃,往serve抽取也不行,再往上抽取,可以抽取我们封装到filter里边啊,可以去封装到filter里边。所以说呢,在这哈,我们可以如果是封装到filter里边,就把这个代码呢,给他在在这个呃呃调整一下哈,Public void filter里边呢,有一个方法叫做do filter。
08:08
在这个do filter里边呢,它会传进来这么几个对象啊呃,Serve request。Response。哎,这个future。哎。那么在这儿呢?我们把这一部分代码呢,就可以给他拿进来。缩进一下。哎,在这里边儿啊,核心操作其实就成了什么了呢。让filter呢,这个趁点do filter这个filter链哈,让这个这个对象呢去放行。诶,只要我们获取好数据库连接啊,后边由他们来控制我们的这个提交或者是回滚,那么在这儿呢,就可以核心操作哈,就是。
09:04
哎,嗯。通过这个chin对象放行当前的这个请求。调change do filter方法把这个request对象传进去,Response对象传进去,哎。哎,因为你想哈,这个filter放行以后,后边执行的service的方法,Service的方法丢的方法,这不就全在这个do filter这个方法的涵盖当中。哎,那么我们就能控制它们在同一个,哎,在同一个事物当中。这样就可以保证啊,当前这个请求覆盖的。Service方法,Service方法,哎,Do方法,都在同一个事物中。
10:01
然后呢,我们各个呃,各个请求呢,都从这个filter这过,这个代码呢,就只写一遍就行了啊,不需要再重复的去写了。同时各个请求都经过这个filter。哎,就是将来我们要创建的一个事物的filter,哎,都经过这个filter。哎,所以这个事物,所以当前事物控制的代码在这里只写。一遍。就行了啊,这个时候呢,效果就是说哎,避免。了我们的代码的冗余,哎。所以说呢,这个事儿呢,我们是需要把它给抽取到filter当中,哎,这我们写的还是伪代码哈,还是伪代码。
11:00
那么说了这么半天呢,这些事儿我们原打算是想说,我们为什么要使用local?啊,这个时候跟thread local又有什么关系呢?诶。接下来我们就要去解释这件事儿。
我来说两句