三、list和iterate不一样算法
a)list取全部数据库
b)literate先取ID,等到用的时候根据ID取对象缓存
c)session中list第二次发出,仍会到数据库查询。session
d)iterate第二次,先找session级缓存。并发
四、一级缓存和二级缓存和查询缓存spa
a)什么是缓存hibernate
能够在内存中开辟一块空间,把原本在数据库中读的东西 放在内存中,这样读的时候直接从内存中读取。xml
b)一级缓存对象
session级别的缓存。一个session不能取另外一个session的内容。事务
c)二级缓存
sessionFactory级别的缓存
弄一个大的缓存,把全部的session所有放在里面
适合场景:
常常被访问,改动不大,数量有限。好比用户的权限,组织机构。
用法:在须要接入缓存的类的上面加@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)//表示既能读也能改
loadt默认使用二级缓存,iterate默认使用二级缓存
d)查询缓存
list默认使用二级缓存加数据,可是查询的时候不用,也就是说,在内存中有对象,可是会去从数据库中查询。
缘由是每次执行query查询的时候可能语句不同,或许查询的数据部分不在缓存中。若是第一次查的语句和第二次
查的同样,会去内存中查,这就是查询缓存。
使用方法:
i.在配置hibernate.cfg.xml中加入
<property name = "cache.use_query_cache">true</property>
固然缓存的配置中必须开启缓存。
ii.session.createQuery("").setChacheable(true).list();
iii.若是使用两次session,不会发出两条查询语句,则证实查询缓存开启。
e)缓存算法
内存里的对象一旦满了,新来的对象会把哪一个对象替换掉?
LRU,LFU,FIFO
LRU:Least Recently Used,最近不多被使用。
LFU:Least Frequently Used ,最近使用频度最低替换, 好比说最近访问100次,哪一个命中率最低,哪一个被替换掉。
FIFO:First In First Out ,谁先进来谁先出去。
设置:
ehcache.xml中在<cache>标签中设置memoryStoreEvictionPolicy=”LRU“
五、事务的并发处理
a)什么是事务?
要么都完成,要么都不完成。
b)常见特性:具备ACID特性
i.原子性
ii.一致性
iii.独立性
iv.持久性
c)事务并发可能出现的问题
i.第一类丢失更新(数据库只要支持事物,这个问题就能够解决)
ii.脏读(*)
读了别的事务没有提交的数据
iii.不可重复读(*)(用在更新操做)
同一个事物先后读的数据不同,被另外一个事务影响了。
iv.第二类丢失更新(不可重复读的特殊状况)
v.幻读(插入和删除的操做)(*)
同一个事务先后读的数据不同,被另外一个事务影响了,在读的过程当中,
另一个事务可能插入一条新的纪录。
d)解决方案
i.让它不要并发
数据库的事务隔离机制
MySQL中查询事务机制:select @@tx_isolation.
serial解决一切问题,可是不设这个级别,当检查问题时才会使用。
咱们通常使用的是read-committed,避免脏读,并发性也比较好,经过其余手段
设定hibernate的事务隔离级别
hibernate.connection.isolation=2
可是这样作仍是会出现不可重复读,幻读的问题
ii.在hibernate中使用悲观锁解决repeatable read 的问题(依赖于数据库的锁)
通常状况下查询总数,不会在一个session中查询,因此暂时不用解决幻读的问题,
实际应用中不太用到悲观锁。
iii.在load第三个参数中加LockMode.UPGRADE
iv.悲观锁是为了防止别人修改,直接加把锁,乐观锁是设置字段,先后进行对比,查看
是否一致,若是一致,则证实没有被改过,若是不一致,则进行响应的处理。
v.乐观锁的实现
增长@version注解,若是有人更新,则会报错,而后根据须要作出相应的解决。