Hibernate中的一级缓存(session缓存)的本质是什么

原创 2018年04月15日 10:58:29
问题:
1:Hibernate中的一级缓存(session缓存)的本质是什么(底层是什么类型,怎样存储数据的,副本是怎么实现的,实体对象的标识符的作用)

代码:
/**查看session的本质是什么
* 在什么时候加进session的一级缓存的
* @author pc
*
*/
public class HibernateSessionTest {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
@Test
public void testname(){
final Session session = sessionFactory.openSession();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
int count = session.getStatistics().getEntityCount();
System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
Transaction transaction = session.beginTransaction();
session.save(new ElecText("gg","ll",new Date()) );
transaction.commit();
}
}


创建一个新的线程一直在查看session缓存中缓存的个数,经过调试得出,在Hibernate源码中的、
public class StatefulPersistenceContext implements PersistenceContext {
// Identity map of EntityEntry instances, by the entity instance
private Map entityEntries;
}类中找到了session一级缓存的本质:就是entityEntries成员变量,类型为Map的子类IdentityMap


总结:session缓存(一级缓存的实际类型是IdentityMap,是StatefulPersisitenceContext中的成员变量entityEntries),副本是在entityEntries.put(entity , e)中的 v 值e 类型为EntityEntry, k值为实例对象,实例对象唯一,拿到的对相应的副本也是唯一,标识符即:Hibernate为实例对象生成的主键值(生成的策略在hbm映射文件中手动配置例如<id name="textID"> <generator class="uuid"></generator> </id>),标识符作用,当一个对象放在session缓存中的时候,根据标识符是否存在类决策发送insert(没有标识符)或update(存在标识符并且entity(持久化对象)和e(e是副本不会变化的)对应的属性值发生了变化)语句

Hibernate开发框架

Hibernate是使用最多的ORMapping设计框架,在本课程之中将为读者完全的讲解Hibernate框架的原理以及各个实体组件的使用。官方QQ群:612148723。
  • 2017年01月02日 10:14

Hibernate的一级缓存Session和二级缓存SessionFactory

Hibernate的一级缓存是指Session,它是一块内存空间,用来存放相互管理的java对象,有了一级缓存,应用程序可以减少访问数据库的次数,提高了性能。在使用Hibernate查询对象的时候,首...
  • qq_19925065
  • qq_19925065
  • 2016-09-19 15:18:16
  • 800

hibernate的缓存和快照 (转载)

Hibernate我们已经学了四天,该讲的知识我们已经讲完,明天放假,后天练习一天就要结束hibernate的学习,有点不舍的,想来hibernate也不是传说中的那么难,在次将hibernate中三...
  • jing_44944
  • jing_44944
  • 2014-10-21 17:15:52
  • 1289

Hibernate之二 一级缓存(session)、二级缓存(sessionFactory)

一、操作Session缓存 (1)flush:Session 按照缓存中对象的属性变化来同步更新数据库 默认情况下 Session 在以下时间点刷新缓存: 显式调用 Session 的 f...
  • icanhaha
  • icanhaha
  • 2015-03-17 10:17:25
  • 4260

hibernate session缓存和java对象生命周期

hibernate session清理缓存时间和持久化对象机制 和 java对象生命周期
  • liang0000zai
  • liang0000zai
  • 2015-08-13 17:14:00
  • 3303

hibernate一级缓存与快照

1、hibernate一级缓存是session级别的。 2、hibernate快照机制是内存级别的。(堆) 3、快照机制: 1)、将数据从DB中取出来 2)、将数据转变成对象,并存...
  • lpp_dd
  • lpp_dd
  • 2017-09-08 10:36:15
  • 338

Hibernate缓存及延迟加载

“缓存”在提高系统性能方面发挥着重要的
  • lemonpan19
  • lemonpan19
  • 2014-11-03 09:58:49
  • 854

Hibernate缓存机制之快照

Hibernate缓存机制之快照(1)、快照是数据的副本 (2)、快照属于一级缓存 (3)、快照是在堆内存中的 (4)、快照的作用:保证数据一致性 当执行`session.getTra...
  • leisure_life
  • leisure_life
  • 2017-03-18 18:13:31
  • 3722

详解Hibernate中的一级缓存

1.前言 在Hibernate中有三级缓存,本篇博客先详细的介绍一下,Hibernate中的一级缓存,也就是Session级别的缓存。  2....
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015-08-14 19:48:56
  • 6965

关于Hibernate一级缓存的快照问题

Hibernate中的一级缓存的底层是以Map形式存在的,key是主键,value是对象,所以它的泛型为Map,key的泛型为串行化是因为主键都可被序列化。简单说完一级缓存的底层原理,下面开始讲快照问...
  • weixin_37504041
  • weixin_37504041
  • 2017-04-14 16:53:40
  • 1572
收藏助手
不良信息举报
您举报文章:Hibernate中的一级缓存(session缓存)的本质是什么
举报原因:
原因补充:

(最多只允许输入30个字)