首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从零开始使用NHibernate:一个新的大型应用程序的提示

从零开始使用NHibernate:一个新的大型应用程序的提示
EN

Stack Overflow用户
提问于 2010-09-14 18:18:55
回答 1查看 579关注 0票数 3

我正在编写一个用于重写现有应用程序的框架。我们有一个大约900个表的数据模型,总共有11000个字段,该字段中的数据库接近120 GB。我的新实现的基本元素是WPF、NHibernate 3、C#、.NET 4.0、NHibernate.Validator和Spring。应用程序本身是非常数据/事务密集型的,我们最大的安装有大约300个并发用户。

有几件事我想要反馈的是:

  • 是个不错的选择吗?为什么我要选择另一个(城堡?)我在启动时间上确实有问题,但我已经能够把它恢复到14秒。不过,我没有注意到春天和卡塞尔之间有什么区别。当然,更短的启动时间是受欢迎的;
  • 我正在使用Identity字段,但是要知道这不是最好的选择。有什么可行的替代方案;
  • 数据显示是用短会话完成的,每个查询一次。另一方面,在整个工作流期间,数据输入有一个会话/事务,最多需要10-20分钟(2-4分钟比较常见)。在整个期间是否有会话/事务的替代方案,我如何设置它?

我对所有的输入都是开放的,并且希望集成那些工作时间更长、使用NHibernate的经验比我更多的人的想法。

(我知道我有点过头了,但这正是我喜欢的方式。)

编辑:我对HiLo太苛刻了,但是经过一些研究之后,Guid确实更适合我的情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-16 09:28:58

Hilo是分配标识符的最快方法。使用标识字段是可行的,而且更安全(见下文),但是由于标识符是由数据库生成的,所以每次插入一行都需要一个读取操作来确定该行的标识符。

如果您要使用hilo,请确保您了解该算法如何工作的细节。(我想它在这个网站的其他地方也有描述。)如果您对列的数据类型、hilo的数据类型或"lo“值做了错误的选择,那么您最终可能会得到环绕,这将导致生成已经使用的数字,这当然是非常糟糕的。

处理数据输入的典型方法是关闭会话,执行数据输入,然后将更新的对象附加到新会话。这一点将在文件中讨论。

附加的棘手之处在于:假设对象A包含对对象B的引用,对象B包含对对象C的引用。如果在初始会话期间“触摸”对象A和B,则A和B将被加载,而B将包含对C的代理引用。如果将A附加到新会话,但忘记附加B,B的代理引用仍将指向旧的封闭会话,如果您试图跟踪它,将导致异常。

它可能比它看起来更难做到这一点。在初始会话期间,如果您调用了一个函数,该函数对对象图进行了某种搜索,那么以后很难确切地知道需要将哪些对象附加到新会话,以使一切正常工作。

根据连接到数据库的可靠程度,将会话保持为数据输入操作并避免将对象附加到新会话所涉及的潜在问题可能是更好的选择。这在很大程度上取决于您的对象模型有多复杂,以及您需要对对象做什么。

使用哪个数据库也很重要。例如,Postgres使用MVCC,因此打开的会话永远不会阻止其他用户从数据库读取数据。在使用行锁定的数据库中,锁是长会话问题的很大一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3711739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档