首页 新闻 会员 周边

NHibernate延迟加载须有的疑问?

0
[待解决问题]

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。。有没有什么方式可以使用第二种方式进行延迟加载。

yzy的主页 yzy | 菜鸟二级 | 园豆:317
提问于:2014-12-22 17:15
< >
分享
所有回答(1)
0

Session是给你发工资的财务,

现在你的意思是,Using一下财务,返回一个领取工资的接口,

以后每个月,还照样可以拿到你的Salary,是吧?

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-12-22 17:29

如果 Session开启后一直不关闭,会不会带来什么问题?

支持(0) 反对(0) yzy | 园豆:317 (菜鸟二级) | 2014-12-22 18:07

@yzy: 如果别人一直占财务的时间, 你觉得你还能拿得到钱吗?  

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2014-12-22 18:10

@问天何必: 你理解清楚了么?不是 一直有人占用领工资的接口,而是领工资的接口一天24小时都开着随时都可以去领。

支持(0) 反对(0) yzy | 园豆:317 (菜鸟二级) | 2014-12-22 18:17

@yzy: Session=接口? 

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2014-12-22 18:21

@问天何必: 你上面不是说接口来着,我顺带也这么说下。Session 肯定不是接口。

支持(0) 反对(0) yzy | 园豆:317 (菜鸟二级) | 2014-12-22 18:23

@yzy: 我比喻错了, 已改正~!

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2014-12-22 18:25

@yzy: 所有有关DataReader的都有一个问题,不支持两个线程同时读(除非开启了某个选项)。

采用Using与不采用Using两种方法都有问题,具体还是要看你的用途。

1、支持使用Using的人无非是说,避免DataReader冲突,避免长期占用数据库连接。

问题则是,每次建立数据库连接的时间较长(当然这个较长其实也不长,毫秒级别的)

2、不使用Using,而使用类似静态变量Connection或是Session这类的,则需要考虑在多线程环境中,多个需求同时请求数据库时产生的冲突。另外,还有数据库连接方面的问题。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-12-23 10:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册