1.注意session.clear()的运用,尤其在不断分页循环的时候
a、在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象
b、另外一种形式的内存泄漏
2.1+N问题
a、Lazy
b、BatchSize
c、join fetch
3.list 和 iterate不同之处
a、list取所有
b、iterate先取ID,等用到的时候再根据ID取对象
c、session中list第二次发出,仍会到数据库查询
d、iterate第二次,首先找session缓存
4、一级缓存和二级缓存和查询缓存
a、什么是缓存
b、什么是一级缓存、session级别的缓存
c、什么是二级缓存、SessionFactory级别的缓存,可以跨越session存在
i、经常被访问
ii、改动不大不会经常改动
iii、数量有限
d、打开二级缓存
i、hibernate.cfg.xml设定:
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
ii、@cache注解
e、load默认使用二级缓存,iterate默认使用二级缓存
f、list默认往二级缓存加数据,但是查询时候不使用
g、如果要query用二级缓存,需打开查询缓存
i、<property name="cache.use_query_cache">true</property>
ii、调用Query的setCachable(true)方法指明使用二级缓存
h、缓存算法
i、LRU、LFU、FIFO
5、事务并发处理
a、事务:ACID
i、Atomic Consistency Itegrity Durability
b、事务并发时可能出现的问题
i、第一类丢失更新(Lost Update)
ii、dirty read脏读
iii、non-repeatable read不可重复读
iiii、phantom read幻读
c、数据库的事务隔离机制
i、查看java.sql.Connection文档
ii、1:read-uncommitted 2:read-committed 4:repeatable read 8:serializable
a) 0001 0010 0100 1000
2:只要数据支持事务,就不可能出现第一类丢失更新
3:read-uncommitted会出现dirty read,phantom-read,non-repeatable read问题
4:read-commited不会出现dirty read,因为只有两一个事务提交才会读出来结果,但仍然会出现non-reapeatable read和phantom-read
5:repeatable
6:serializable解决一切问题
d、设定hibernate的事务隔离级别
i、hibernate.connection.issolation = 2
ii、用悲观锁/乐观锁解决repeatable read问题