00:01
管理session。哈姆自身提供了三种管理session对象的方法,第一种,Session对象的生命周期与本地线程绑定,OK,与本地县城绑定,是不是感觉这个词挺熟的呀?我们在前面讲那个障碍外部综合案例的时候。我们就搞了一个与本地线程绑定的connection,还记得吧,哎,跟那个相类似。通过代码进行说明。我们来创建一个DAO。这个包。创建一个。操作department的department。方法,Publicvo save。Save department。这里边呢,我要对这个department执行保存操作,在调一个session点方法。
01:02
Epd OK,怎么出来?第一种方案,也是最简单的,大家最容易想到的一个方案,我直接传入一个session不就可以了吗?烦。这样的话呢,我就可以执行一个保存操作,我们想一想,这种方案的话呢,固然可行,但是有什么问题没有。不要这么做的话,意味着什么呀?他说。若需要。传入一个啊。Session对象。则意味着。上一层上一层,Lu的上一层可能是service需要。获取到。在认对象是吧。这说明。
02:01
上一层需要和。Hat。API。耦合。很明显。这样我们是。不推荐。所以。不推荐使用此种。一种方式我们不推荐,因为要这样搞的话呢,我们在。上一层需要传入一个session,比方说上一层是service,他还需要知道我这个底层是如何实现的,叫他让人不爽了。我们只想提供一个干干净净的自由方法。我们只想这样提供,但是呢,Department是要有的,因为有些持久化嘛,那我直接搞个30.co多好。
03:02
吧,我直接这样搞。那既然不能从外部传进来,只能是内部获取了。内部获觉。三生一项怎么获取啊?获取跟当前线程绑定的对象对吧。获取和当前线程绑定的。三声对象它的好处啊,有两个,一个不需要。从外部。传入。Session对象,第二个因为是跟当前线程绑定session对象,多个方法也可以使用一个事物。
04:01
对吧,有两个好处,所以说的话呢,这应该是从当前线程获取这个赛程对象,那怎么获取呢。那我们在前边的话呢,我们说过可以用selectad local啊跟select local绑定的方式来获取,但实际上在我们这个harm里边,它已经。成熟的提供了一个方法。叫啊,使用threatad这个方式来管理session。怎么用这个thread来管呢?我们只需要在上面的配置文件里边配置这样的一个属性就可以了,这个取值呢,是thread。具体获取的方式是。调用。Session factory get current session方法就可以获取到跟当前线程绑定的session对象。所以说我们可以来提供一个YouTube类。
05:03
Harmon us。这里边呢,我们首先我们要提供一个方法,就是返回再factory。因为这个factory于当前应用而言应该只有一个,对吧,它是一个重量级的对象吗?At SAN act。如果这个对象是。宫我就直,我就创建一个,然后给他返回。然后这个没问题是吧,这空的话呢,给它进行初始化,找到它找到这个方法。Lucy。最里边。最大化。可以了。
06:04
获取SESSION3,然后呢,我们再提供一个方法获取session。At。看吧,如何获取呢?Return at。Session factory.get current session叫获取跟当前线程绑定的在。那对应的我这个harmless u应该是一个单例的。Private de harmon。等于。提供一个干的方法。搞一个实例出来。就这吧。六。
07:01
Haonlets。啊,单例的,我们从那个单例这个项里边的话呢,可以搞到session factory,而且还可以获取到跟当前现程绑定的session,于是我来获取一下这个session,我们看一下HTDP哈,这GDP是哪个啊。We里边的是吧,Session session。等于harmon get instance GA在这,然后呢?我们打印一下他的哈。就是说我可能多次到这个自有方法在一个事物里边哈,我们要看。他们是不是同一个赛?OK,测试一下。Public void test manager。ADD。
08:02
创建一个department dau的实例。等于new department DAO。我们来调用这个方法,我们这里面实际上的话呢,并没有这个保存操作啊。我不传入这个apartment了,我们直接填这个session,这个session是不是一个。盗用department DAO的。自有方法,闹吧。三次有一个。这还不行是吧,他说。当前session没有配置,这边我需要配一下。本领。
09:01
Session的方式。Property current contact class zero。到了多次,哈西马是一样的。这块呢,只是我们的一个模拟操作,我们看到实际上保存的话呢,不会成功,那实际上的话,我们在后边我们学自不论生命事物的时候该怎么样啊。我应该在这个位置。获取session,然后呢。开启事物,我搞一个啊。Session等于一样的harmon bad开启事务。等于三点。
10:01
Transaction。这里边儿的话呢,我也打一个第三。加3.7code。这块我直接提交事务就可以了。Commit,而不需要在关闭sessiondog3.is。It's open。直接提交事物,我们看这个session是不是还是打开的。创建一个department。DP地点,Site。找一个名字,这个名字呢,爱的硅谷。啊,这个时候的话,我们就可以执行这个保存操作了。有一个。
11:04
这是一样的是吧,False。赛是关闭的是吧?当我调这个可逆的方法的时候,塞已经被关闭了,说不。三生是由。TH来管理的则。再提交或。回滚事务值啊已经。关闭。但是省事吧,那我没有执行保存是为什么呀,你就把这块布了打开就可以了。快走,我们就会看到三条眼色。没问题。行,这就是我们最终的一个这个操作,那我们可以用这样的方式呢,来让session和当前线程绑定,那我们在上一个项目里面,我们就可以利用这样的方式,比方说我们在那个filter里边是吧?哎。
12:08
获取session,开启事物,然后在那个filter结尾呢,我们可以提交或回滚事物啊,不用关赛事,其一其二,我们也不用去写那个logo那样的一个类。直接用。这样的方式获取就可以了。实际上在我们后边去集成的时候,还有更简单的方式。什么方式啊?我们可以让这个DA录入一个。三注入一个factory。Satfacty,然后呢,我们这块直接从satfacty get conversation就可以了。这个的话呢,我们在跟思润集成的时候,我们还会讲,大家暂时先有一个了解。回来。
13:00
看一下harmonate自身提供了三种管理赛程对象的方法,第一种方法,也就刚才我们说的哈三对象生命周期跟本地线程绑定。怎么做呢?我们在哈的配置文件里边配置这样的一个属性,让这个取值是TH就可以了。那第二种第三种我们暂时先不看,在我们后边用到的时候的话呢,我们再提。我们说一下,如果a current second contact class这个只是stress的话,那么我管理这个流程是什么样的?我第一当一个线程当当一个线程第一次调session factory get current session的时候,它确实是会创建一个session,而且让这个session跟这个线程A绑定,我这个线程再调session factory get current session方法的时候,这个时候就返回刚刚才跟这个线程绑定的。对象。好了,后边如果要是再去调用这个方法的话,始终是返回。
14:01
第一次调用,而且跟当前线程绑定的那个session好了,如果调用之后的话呢,我做了一个提交。或者是。Low back回滚的话,它会执行提交或回滚操作。同时关闭session审。那这个session生命周期呢就完了,那如果还是这个线程又掉了一次这个方法的话,它将创建一个新的session,重复刚才的过程。听清了吧?OK,在我们单独用harm的时候,我们需要来配置这样的一个属性。我们在跟斯集成的时候是不需要配置的,后面再说。下一话题,如何批量处理数据?这个批量处理呢?我们通常情况下指的是批量的添加、删除、修改。呃,有四种方式,第一种方式通过session,第二种方式通过HKL,第三种方式通过无状态的session,第四种方式通过jdbc API,我们先直接给出结论,我们推荐使用第四种方式,凡是批量操作使用原生jdbc API是。
15:15
最快。我们来写一个,大家看一下啊。批量操作。Public hit bench。At text可以调一个3.do。方法,New。这里边有ma。哎,装通过JDBC原生的API。进行操作。
16:02
效率。被告。速度。具体如何写的话。我们这讲GBC的时候已经说过了,我们这里边不敢重复。其他几种方式的话呢,我们做一个了解,大家知道有那回事儿是吧,但是我们并不推荐。通过session。首先说为什么说通过session不好,因为你要session执行这个save跟update的话,我们是不是会把那个对象纳入到这个session的。缓存里边啊,就是那后面那个一级缓存,你这样的话,那缓存里边可以放到对象,它是有限的呀。那老那么放的话,他不是爆了吗?那于是的话呢,我们想到了这么一个办法。这样的一个方式,大一点大家看,大家看一下。嗯。我执行到一定程度的时候呢,我执行flash在克尔,但是这个速度啊,快不了多少。
17:06
嗯,这样的方式的话呢,起码不会导致这一个一个对象把那个赛车混撑爆了,仅是解决这个问题,但这个速度呢,并没有快到很多。还需要注意。如果底层用的是identity标示生成器的话,这个方式不行。为什么呀,你要是identity的话,我是不是只有插入这个对象的时候,我才会获取到那个ID啊,所以说你每调一次这个save方法都会导致一个隐色的,所以说你还是一条一条插入的,所以说这个效率根本就上不来。这是一个需要。注意的地方,而且的话呢,还有一个限制是吧,它建议关闭session har的二级缓存啊,这个做一个了解就可以了,我们不推荐这样用。当然了,如果你查的这个数据量非常小,比方说百十来条,这样做无所谓。你要是上万条的话。
18:01
或者上10万条,上百万条的话,那我们极不推荐。批量更新,进行批量更新的时候呢,如果一下子把所有对象都加载进来的话,然后再一一更新,很明显是不可取的,怎么办呢?我们可以用这样的一个可滚动的结果集,这个可能可滚动结果集的好处就是它不会加载任何对象,它仅是包含了在线定位记录的那个游标。然后的话呢,再一条一条的进行操作。啊,只是解决了我们那个呃,塞身缓存的问题。但是从运行速度上显然没有原生的JDBC快,因为它底层是不是还得翻译成JDBC啊?对吧,大家知道有这样一个方案就可以了。HKLHKL,我们在讲HKL的时候,我们说过是吧,如果你修改的这个字段是有规律的,比方说啊,每个人工资都加十块钱,或者说把这个email都变一下,Email后边再加上一个点还是怎么样,这个时候的话呢,你用我们HQL里边的delete跟update是可以解决问题的,但是添加HQL排不了HQL支持这样的方式。
19:15
Insert into后面加上一个select什么呀,子查询的方式,它不支持insert into values,所以说这个东西如果要是更新的时候,这个更新是有规律的,可以用一条语搞定。但是添加他是搞不定的。而且更新跟修改要是没有规律的话,他也搞不定。再说一个使用无状态的session,这个特点呢,就是说它没有缓存。这是最大的一个特点。但是还是那句话是吧,它底层还是给它,呃,翻译成JDBC对应的这个色口,所以说直接用JDBC来的更实在,OK以上呢,我们简单的说了一下,也没有进行操作。
20:04
我们说了一下呃,如何在应用层进行赔偿操作,有通过session的,通过HKL的,通过无状态session的,通过jdbc API的,我们推荐使用这样的方式,其他几种方式啊,做一个了解就可以了。
我来说两句