<b>Hibernate中Session的缓存及对象的情况</b>[Java编程]
本文“<b>Hibernate中Session的缓存及对象的情况</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于session这个接口的学习可以说是最痛楚也是最复杂的,因为它所触及的方面太多了,一些躲藏的机制也很多,谁让它是Central API呢.
关于它的几个最基本的办法如save()、delete()、flush()等的学习都花了我一定的时间.在深化理解这些这些办法前,理解session的缓存机制以及Hibernate中Java对象的状况对我们是很有帮忙的.
一.Session的缓存
Java是纯面向对象的语言,因此不大概像C语言那样直接操作内存,比方声明一段可用的内存空间.在Java里面,缓存普通是指Java对象的属性占用的内存空间,普通是一些调集范例的属性.在session接口的实现类SessionImpl中定义了一系列的Java调集,这些Java调集就构成了Session的缓存.
利用缓存的一个很明显的好处就是可以削减数据库拜候的频率,提高利用程序的性能,因为从内存中读取数据明显要比从数据库中查询快多了.按照我个人的理解,Session的缓存实际上起到了一个“过渡仓库”作用.就像魔兽中的豪杰一样,身上城市背有一个包,用来存放常用的物品如补血药水、补魔药水、回城卷等等.假如想用回城卷而身上没有回程卷的话就要跑到商店去shopping了,这样就会浪费大量的时间了,除非你目前就在商店旁边;假如想用的回城卷的时刻身上就有的话,豪杰便可以直接用而没必要大老远的跑到商店去了.我们的Session的缓存可以说就相当于豪杰身上的背包,我的利用程序就是豪杰,而数据库就是商店咯,以下图所示.
当然这个比方不是很精确了,比方说在Hibernate利用中我们可以向数据库插入一条新的记录,而在魔兽中你是不大概给商店增添存货量的,只是为了便于理解,才作了这么一个比较.
二.Hibernate中Java对象的状况
在一个Hibernate利用中,Java对象可以处于以下三个状况之一:
1.暂时状况(Transient).处于这个状况的对象还被没有归入Hibernate的缓存管理体系,跟任何session都不关联,在数据库中也没有对应的记录.
2.长期化状况(Persistent).处于这个状况的对象位于Session的缓存中,并且和数据库中的一条数据记录像对应.
3.游离状况(Detached).处于这个状况的对象不再位于Session的缓存中,它与暂时对象的最大辨别在于,游离对象在数据库中还大概存在一条与它对应的记录.
上述3个状况之间是可以彼此转化的,并且我们所说的状况都是针对某一个session实例而言的,比方说,对象A关于session1而言是处于长期化状况的,因为它处于session1的缓存中,但是关于session2而言对象A并不在它的缓存中,因此它是处于游离状况的.
关于这几个状况的理解耗费了我一定的时间,因为老是有一些稀罕古怪的动机在我脑海中产生.比方说,关于暂时状况的定义,假如我新建一个对象,然后人为的让它属性的值和数据库中的一条记录对应,包含id的取值都一样.此时它可否说是处于游离状况呢?因为它和一条记录想对应呀.实际上这些情形都是由于一些不和标准的操作而产生的.在Hibernate利用中,无论Java对象处于暂时状况、长期化状况还是游离状况,利用程序都不该该改正它的OID.OID的值应当由Hibernate来保护和负责,实际上Hibernate在同步缓存中的对象与数据库中的记录时,都是通过OID来举行关联和映射的,假如利用程序人为的改正了对象的OID,就会招致一些莫名其妙的错误,并且这样也不利于数据的同步.
以上是“<b>Hibernate中Session的缓存及对象的情况</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |