.NET进阶—Nhibernate之Session

  Nhibernate就是Hibernate的.NET版,原理相同,下文都是从Hibernate说的,因为Hibernate的资料相对更多些。


  首先解决上篇博客最后的一个小问题,以前开发中使用的Session通常用来一些经常被用到的用户Id,权限等等,表示客户端与服务器的会话;在Hibernate中Session是操作数据库的句柄对象,表示与数据库的会话。所以说从意思上说都表示一次会话,但会话的本质却不同。


什么是Session

  Session是Hibernate向应用程序提供操作数据的主要接口,提供了load,get,save,update等方法,其实就是对Connection的一个高级封装,一个Session就对应一个Connection

  同时为了提高性能,Hibernate提供了两种级别的缓存,其中一级缓存就是Session级的缓存,就是将以上方法操作的对象放入缓存进行管理,在需要数据时首先从缓存中获取,以此来提高系统的性能。


什么是缓存

  为了能够更好的理解Session缓存,首先来了解缓存,说到缓存一般都会想到计算机的缓存,比如CPU的高速缓存,优先于内存与CPU交换数据。而在ORM框架的中的缓存一般存在三种形式:

  1事务级缓存:即在当前事务范围内的数据缓存.就Hibernate来讲,事务级缓存是基于Session的生命周期实现的,每个Session内部会存在一个数据缓存,它随着 Session的创建而存在,随着Session的销毁而灭亡,因此也称为Session LevelCache.

  2应用级缓存:即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享(数据库事务或应用事务),事务之间的缓存共享策略与应用的事务隔离机制密切相关.在Hibernate中,应用级缓存由SessionFactory实现,所有由一个SessionFactory创建的 Session实例共享此缓存,因此也称为SessionFactoryLevel Cache.

  3分布式缓存:即在多个应用实例,多个JVM间共享的缓存策略.分布式缓存由多个应用级缓存实例组成,通过某种远程机制(RMI,JMS)实现各个缓存实例间的数据同步,任何一个实例的数据修改,将导致整个集群间的数据状态同步.


  如上所述,Session缓存就属于其中的事务级缓存,Session对象的生命周期也就对应一个数据库事务或者一个应用事务,这样也使得一个线程对应一个Session,一个用户就是一个线程,保证了线程中对象和数据库的同步。


Session缓存的管理

  

  当调用Session的save()、update()、saveOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。


小结

  项目中遇到的问题更多是级联更新或者保存,如果只是单表操作,基本不用去关心Session什么时候开启的,什么时候关闭的,但是当涉及到级联或者事务内操作时经常遇到Session缓存的问题,而通过这次的项目也从错误中总结出了规律,现在再通过原理进行学习,感觉明朗了很多。下篇继续Hibernate级联操作。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值