欢迎投稿

今日深度:

Hibernate中的Session缓存问题,hibernatesession

Hibernate中的Session缓存问题,hibernatesession


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. 使用 HQLHibernate 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 >




hibernate session 查询时的缓存问题

HibernateSessionFactory.getSession(){
Session session = sessionThread.get();
if(session==null || !session.isOpen()){
if (sessionFactory == null) rebuildSessionFactory();
session = sessionFactory.openSession();
sessionThread.set(session);
}
return session;
}
首先说下你的session获取不合理 一般session获取都是工厂模式的 而且每次使用都关闭的 按着这个做session缓存就没了
 

hibernate session缓存疑问

我现在也在看这本书,"对象关联在session上"和"对象保存在session缓存中"是一个概念。
在session中delete(a)时,如果a是持久化对象(已经在session的缓存中),session就执行delete语句,删除数据库中对应的记录。
如果a是游离对象,先使游离对象a和session关联(其实就是加载到session的缓存中),使它变成一个持久化对象,然后在执行delete语句。
session的增删改操作是面向对象的,你仔细研究研究 第7章 操纵持久化对象 看看session是怎么把临时对象和游离对象关联到session缓存中的;
怎么把持久化对象转变为游离对象或临时对象的!
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4439.html NewsArticle Hibernate中的Session缓存问题,hibernatesession 1. Session 缓存: 1 ) . 在 Session 接口的实现中包含一系列的 Java 集合 , 这些 Java 集合构成了 Session 缓存 . 它 用于存放 Session 关联的对象 ( Sess...
评论暂时关闭