我正在编写一个重写现有应用程序的框架。我们有一个大约900个表的数据模型,共有11000个字段,数据库接近120 GB。我的新实现的基本元素是WPF,NHibernate 3,C#,.NET 4.0,NHibernate.Validator和Spring。应用程序本身是非常数据/事务密集型的,我们最大的安装大约有300个并发用户。
我想要反馈的一些事情是:
春天是个不错的选择吗?我为什么要选择另一个(城堡?)。我确实有启动时间的问题,但我已经能够将其恢复到14秒。我没注意到Spring和Castle之间有太大的区别。更短的启动时间当然是受欢迎的;
我正在使用标识字段,但要了解这不是最佳选择。有什么可行的选择;
数据显示是通过短会话完成的,每个查询一次。另一方面,数据输入在整个工作流程期间具有一个会话/事务,最多可能需要10-20分钟(更常见的是2-4分钟)。在整个持续时间内是否有会话/交易的替代方案,我该如何设置?
我对所有输入都持开放态度,并希望整合那些工作时间更长,并且对NHibernate有更多经验的人的想法。
(B.t.w。:我知道我已经超越了我的头脑,但这就是我喜欢的方式。)
编辑:我对HiLo过于苛刻,但经过一番研究后,Guid似乎更适合我的情况。
答案 0 :(得分:1)
Hilo是分配标识符的最快方法。使用标识字段是有效的,并且更安全(见下文),但由于标识符是由数据库生成的,因此每次插入行都需要读取操作来确定行的标识符。
如果您要使用hilo,请务必了解算法的工作原理。 (我认为它在本网站的其他地方有所描述。)如果您对列或hilo的数据类型或“lo”值做出错误的选择,最终可能会导致回绕,这将导致已生成的数字被生成,这当然是非常糟糕的。
处理数据输入的典型方法是关闭会话,执行数据输入,然后将更新的对象附加到新会话。这在文档中有所介绍。
附加的棘手之处在于:说对象A包含对对象B的引用,对象B包含对对象C的引用。如果在初始会话期间“触摸”对象A和B,A和B将已加载,B将包含对C的代理引用。如果您将A附加到新会话,但忘记附加B,B的代理引用仍将指向旧的已关闭会话,如果您尝试将导致异常跟着它。
它似乎比看起来更难。在初始会话期间,如果您调用了一个通过对象图进行某种搜索的函数,则可能很难在以后确切地知道哪些对象需要附加到新会话以使一切正常工作。
根据您与数据库的连接的可靠性,对于数据输入操作保持会话打开并避免将对象附加到新会话所涉及的潜在问题可能是更好的选择。这很大程度上取决于对象模型的复杂程度以及对象需要做些什么。
您正在使用哪个数据库也很重要。例如,Postgres使用MVCC,因此开放会话永远不会阻止其他用户从数据库中读取。在使用行锁定的数据库中,锁是长会话问题的主要部分。