概念
通过在
map中保存所有的加载对象,确保对象只加载一次,每次查找对象都先去map中查找是否有这个对象,如果有就返回,没有才去加载
场景
1、管理从数据库加载的对象,使之持久对象在内存中始终唯一
2、作为从数据库加载对象的缓存器,可以避免每次读数据时候都要从数据库加载
应用
单数据库简单用法:对每个表都有一个对应的
map,当需要从数据库中加载一个对象的时候,你首先核实一下map,如果map中存在一个和你所需要加载的对象相等的一个对象,直接返回这个对象,如果没有,查找数据库,并且把加载出来的对象放到map中。
注意点
1、关键字的选择
:以表名作为map的关键字,以主键作为map中各个对象的关键字
2、
Explicit or Generic:Generic是对每类对象都采用一个方法,比如find("Person", 1),其中一个输入参数制定是什么类型的对象,好处在新增加一个map不需要重新些一个方法。Explicit是对每类对象分别采用不同的方法,比如:findPerson(1),好处比较直观,如果通过泛型来做的,也可以做到新增一个map不用重新一个方法。
3、
map的数量:每类对象对应一个map,如果不同类的每个对象都有一种标识能区别的,可以用次方法,有利于管理map,而且增加一类对象的时候也不需要在家map;整个session对应一个map,比较符合数据库的设计,每个map用表名作为key,比较清晰,但是比较难处理的是继承树的处理。
4
、存放位置:如果存放在
processContext
,必须关注的是必须确保不同
session
只能得到他自己的对象。还有就是对
map
要进行事务性的保护,其中涉及到两个问题,第一个就是尽管你是用关系型数据库来保存数据,但是你必须把加载的数据作为对象放在事务性缓存中,第二个是那些只读对象,因为不需要进行修改,所以可以在整个
processContext
中都可以使用,有种方法是只读对象的
map
放在
processContext
中,可修改对象的
map
放在
session
中。