Hibernate的clear(),flush(),evict()方法详解
来源:互联网 发布:看耽美的软件 编辑:程序博客网 时间:2024/05/16 12:41
1.Clear 方法
无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强制清除Session缓存。
例:
public void testClear(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher) session.get(Teacher.class, 3);
System.out.println(t.getName());
Teacher t2 = (Teacher) session.get(Teacher.class, 3);
System.out.println(t2.getName());
session.getTransaction().commit();
}
这里虽然用了2 个 get 方法( get 方法会立即执行 sql 语句),但因为第一次执行了会缓存一个 ID 为 3 的实体,所以虽然有 2 个 get 方法只执行一次 SQL 语句。
这里在第2 次 get 前执行 session.clear(), 我们把 hibernate show_sql 出来,它就会执行 2 次 sql 语句了。 所以session.clear() 会清除缓存。
2.Flush方法
可以强制进行从内存到数据库的同步。
例
public void testClear(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher) session.get(Teacher.class, 3);
System.out.println(t.getName());
session.clear();//这里不clear只会执行一次sql语句,有clear会执行2次
Teacher t2 = (Teacher) session.get(Teacher.class, 3);
System.out.println(t2.getName());
session.getTransaction().commit();
}
我们setName() 2 次, 但程序只会更改数据库一次,在 commit 时。
@Test
/**
* flush 强制与数据库同步
*/
public void testFlush(){
Session session = HibernateUitl.getSessionFactory().getCurrentSession();
session.beginTransaction();
Teacher t = (Teacher) session.get(Teacher.class, 3);
t.setName("yyy");
t.setName("yyyyy");
session.getTransaction().commit();
}
我们在第2 次 setName ()时 执行 session.flush().
再看hibernate 执行的 sql 语句
Hibernate:
update
Teacher
set
birthday=?,
name=?,
title=?
where
id=?
Hibernate:
update
Teacher
set
birthday=?,
name=?,
title=?
where
id=?
执行了2 次 Update
所以看出来flush 方法会强制与数据库同步。
Flush方法是可以设置的,也就是 fulsh 什么时候执行是可以设置的
在session.beginTransaction 前设置 FlushMode
session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)
FlushMode有 5 个值可选
Always:任何代码都会 Flush
AUTO:默认方式 – 自动
Commit:COMMIT时
Never:始终不
MANUAL:手动方式
设置FlushMode 有个好处是可以节省开销,比如默认 session 只做查询时,就可以不让他与数据库同步了。
- Hibernate的clear(),flush(),evict()方法详解
- Hibernate的clear(),flush(),evict()方法详解
- Hibernate的clear(),flush(),evict()方法详解
- Hibernate的clear(),flush(),evict()方法详解
- Hibernate的clear(),flush(),evict()方法详解
- Hibernate的clear(),flush(),evict()方法详解
- Hibernate的clear(),flush(),evict()方法详解
- Hibernate的clear(),flush(),evict()方法详解
- Hibernate中session的clear(),flush(),evict()方法详解
- Hibernate中session的clear(),flush(),evict()方法详解
- Hibernate中session的clear(),flush(),evict()方法详解
- Hibernate的evict()方法和clear()方法、flush()方法
- Hibernate--clear(),flush(),evict()
- hibernate session中clear、evict、flush方法的区别
- Hibernate Session中flush、clear、evict方法的区别
- Hibernate 的clear()、flush()、evict(obj)使用
- Hibernate clear(), flush(), evict()区别
- Hibernate的evict方法和clear方法的区别
- ural 1306(堆-优先级序列)
- hdu 分类
- struts2工作原理
- Web服务器:IIS 7 应用程序池自动回收关闭的解决方案
- hdu 1728 逃离迷宫(BFS 有 限制条件,陷阱比较多)
- Hibernate的clear(),flush(),evict()方法详解
- OCI连接池
- android 禁用锁屏 到修改方式
- ARM状态寄存器 CPSR SPSR
- UVA 10131 - Is Bigger Smarter? (动态规划)
- 去掉UITableView的header和footer的黏性效果
- Delphi 串口通信(1)
- ascii160 和 ascii32 的区别
- hdu 2544 最短路