在NHibernate中有延迟加载和立即加载两种方式。
1.立即加载,通过配置映射文件可以让对象能够立即加载,这种情况就不存在必须有Session存在,因为立即加载的时候Session肯定是存在的。
2.延迟加载,NHibernate默认是延迟加载。但是延迟加载的时候,必须保持Session的存在,如果Session被销毁的话,将会抛出异常。如下代码:
//延迟加载 public Order LazyLoad() { //返回order对象后ISession将继续存在 return session.Get<Order>(2); //返回order后ISession将会立即被销毁 //using (ISession iSession = new SessionManager().GetSession()) //{ // Order order = iSession.Get<Order>(2); // return order; //} }
里面有两种情况,一种是获取对象后,不立即释放Session,Session会一直存在, 另外一种就是使用using获取完对象后立即释放Session。 面对这两种情况,只有第一种才能做延迟加载,而第二种的话就必须是立即加载。
说这么多主要就是想问下。如果使用第一种方式获取对象后不释放Session,和第二种释放Session有什么差别,如果没什么差别,为什么要分两种,看了他的代码好像也就是当Session不存在的时候重新开启一个新的如果存在则直接使用现有的Session。。有没有什么方式可以使用第二种方式进行延迟加载。
Session是给你发工资的财务,
现在你的意思是,Using一下财务,返回一个领取工资的接口,
以后每个月,还照样可以拿到你的Salary,是吧?
如果 Session开启后一直不关闭,会不会带来什么问题?
@yzy: 如果别人一直占财务的时间, 你觉得你还能拿得到钱吗?
@问天何必: 你理解清楚了么?不是 一直有人占用领工资的接口,而是领工资的接口一天24小时都开着随时都可以去领。
@yzy: Session=接口?
@问天何必: 你上面不是说接口来着,我顺带也这么说下。Session 肯定不是接口。
@yzy: 我比喻错了, 已改正~!
@yzy: 所有有关DataReader的都有一个问题,不支持两个线程同时读(除非开启了某个选项)。
采用Using与不采用Using两种方法都有问题,具体还是要看你的用途。
1、支持使用Using的人无非是说,避免DataReader冲突,避免长期占用数据库连接。
问题则是,每次建立数据库连接的时间较长(当然这个较长其实也不长,毫秒级别的)
2、不使用Using,而使用类似静态变量Connection或是Session这类的,则需要考虑在多线程环境中,多个需求同时请求数据库时产生的冲突。另外,还有数据库连接方面的问题。