您好,欢迎访问一九零五行业门户网

Hibernate中的Session缓存问题

1. session 缓存: 1) . 在 session 接口的实现中包含一系列的 java 集合 , 这些 java 集合构成了 session 缓存 . 它 用于存放 session 关联的对象 ( session 关联对象的方式有很多种。 例如:session.get ( class , oid ) 、 session.update () 、 session
1. session 缓存:
1) . 在 session 接口的实现中包含一系列的 java 集合 , 这些 java 集合构成了 session 缓存 . 它用于存放 session 关联的对象( session 关联对象的方式有很多种。 例如:session.get (class , oid )、 session.update()、 session.save () ...)。 只要 session 实例没有结束生命周期 , 且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期。 session 缓存可减少 hibernate 应用程序访问数据库的频率。
2) . 操作 session 缓存的方法(了解一下吧)。
①. 若调用 session.get () 从数据库中加载一个对象,则该对象会被纳入到 session 缓存中。
news news = (news ) session.get (news.class , 1);
//会向数据库发送 sql 吗 ? 不会发送 sql 语句 , 而是从 session 缓存获取对象的引用(快照) news news2 = (news ) session.get (news.class , 1);
②. session 的 clear() 方法可以清空 session 的缓存
news news = (news) session.get(news.class, 1);
//清理 session 缓存 session.clear (); //会向数据库发送 sql 吗 ? 会 ! 因为 session 缓存被清空了 ! news news2 = (news ) session.get (news.class , 1);
③. session 的 flush() 方法: 清理缓存 - 强制使数据库记录和 session 缓存中对象状态保持一致,可能会发送 sql 语句 (若数据库记录和 session 中对象状态不一致,则发送 sql,否则不发送 sql)
i. 默认情况下,提交事务时,会先清理缓存,然后再提交事务
ii. 若主键生成方式使用的是数据库底层的自增长方式,会在执行 session 的 save() 方法时,就清理缓存,执行 insert 语句,而不是等到提交事务时。 hibernate 要求和 session 关联的对象必须有和数据表记录对应的 oid,这就意味着执行 save() 方法后,必须有 oid ,而底层自增长的方式生成主键,必须先执行 insert 才能获取主键值
//若使用 mysql 底层自增的方式生成主键, save() 方法即会引起发送 insert 语句 session.save (news ); system.out.println (news.getid ());
iii. 使用 hql(hibernate query language )查询记录时,不经过 session 缓存!直接查询数据库,且要求查询的结果是最新的! 所以,在进行 hql 查询之前需要先清理缓存 session.save(news);
//会导致清理缓存 news news2 = (news) session.createquery (from news n where n.id = ? ) .setinteger (0 , news.getid ()).uniqueresult ();
iv. commit() 和 flush() 方法的区别: flush 执行一系列 sql 语句,但不提交事务; commit 方法先调用flush() 方法,然后提交事务 . 意味着提交事务对数据库的操作永久保存下来。
④.refresh () 方法: 强制使 session 缓存中的对象的状态和数据库记录保持一致。所以会强制发送一条 select 语句。 注意,因为 mysql 的默认的隔离级别为 read reptable 。所以需要设置事务的隔离级别才能看到实验的效果
!-- 设置 hibernate 的事务的隔离级别, 设置为读已提交 --> property name =connection.isolation >2 property >
其它类似信息

推荐信息