系统升级NHibernate遇到的问题

原帖:http://www.cnflysky.com/?uid-1-action-viewspace-itemid-26

系统之前使用的是NHibernate1.0.2的版本,目前最新的版本为1.2.0,据说新的版本在性能上做了较大的改善,而我们现在系统遇到的一个比较大的问题也正是性能问题,于是就有了把系统使用的NHibernate版本进行升级的想法。经过一个周末的准备,今天便开始正式动手。

  首先,所有的实体类的公共字段和公共方法都得补上virtual属性,virtual属性在1.0.2版本中也能正常使用,这些工作在上周末已经做好。

  接着,将项目中所有的旧的NHibernate程序集全部删除,导入新版本的程序集文件,然后编译项目,OK,好象一切都挺顺利的!那就先运行程序看看,F5执行~~~系统主界面出来了,呵呵,真是开心。好,继续。登陆系统后,完了,出现异常,查看异常信息,提示“Could not initialize proxy - the owning Session was closed”,这是怎么回事?只能上网查查看了,网上的资料以Hibernate居多,不过没关系,两者本来就是同一个娘胎里出来的兄弟,架构都是一样的。

  查出问题的原因了,这问题其实就是就是会话关闭,无法对Hibernate实体进行操作。造成这样的情况有很多,什么书写错误啊,逻辑错误啊。但其中和我遇到的情况最符合的应该是lazy机制问题。

  延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误。这个问题在NHibernate1.0.2版本中倒没有出现,可能是新版本的改动引起的吧,先不管了,看看该怎么解决。

  查到的方法有两种,一个是hbm.xml文件的修改,默认的<class>元素的lazy属性为true,把属性改为False就可以解决问题,但是整个系统有好几百个hbm.xml配置文件,一个个改?算了,太麻烦了。再看看另一个方法吧,把session.Load()方法改成session.Get()就可以解决问题,嗯,这个简单,不过还是要看看Load和Get有什么区别。

两者的区别在于:
Get在没有符合查询条件的情况下,将会返回null,若符合,则会返回一个persistent instance;
而Load在没有符合条件的情况下会抛出一个ObejctNotFoundException的异常,若符合,可以返回一个persistent instance或者该持久类的代理类
除此之外呢?baidu一下,发现在hibernate里有这么种说法(注意是hibernate,没有n)
"get方法仅在内部缓存中查找数据,如没有找到对应数据,将越过二级缓存,直接调用SQL读取数据,而Load方法则充分利用了内部缓存和二级缓存中现有数据" 。

  找到解决方法了,那就赶紧动手吧,好几个兄弟在等着我把程序签进去呢。重新修改数据层NHibernate连接数据库获取记录产生对象的方法,将这前的Load改为Get。好了,再编译一下,运行。系统登录正常,进模块试试,还是报错,不过是另一个错误了,哦,没关系,原来是hbm.xml文件中的<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">得改成<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">才行,版本升级了嘛,这些文件也得跟着升级才行。

  终于OK了,忙了大半天,系统终于升级成功,系统的主流程都运行了一遍,没有问题,嘿嘿,接下来就好好研究一下NHibernate1.2.0到底能在性能上有多大的改进了。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值