我正在编写一个用于重写现有应用程序的框架。我们有一个大约900个表的数据模型,总共有11000个字段,该字段中的数据库接近120 GB。我的新实现的基本元素是WPF、NHibernate 3、C#、.NET 4.0、NHibernate.Validator和Spring。应用程序本身是非常数据/事务密集型的,我们最大的安装有大约300个并发用户。
有几件事我想要反馈的是:
我对所有的输入都是开放的,并且希望集成那些工作时间更长、使用NHibernate的经验比我更多的人的想法。
(我知道我有点过头了,但这正是我喜欢的方式。)
编辑:我对HiLo太苛刻了,但是经过一些研究之后,Guid确实更适合我的情况。
发布于 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,因此打开的会话永远不会阻止其他用户从数据库读取数据。在使用行锁定的数据库中,锁是长会话问题的很大一部分。
https://stackoverflow.com/questions/3711739
复制相似问题