c# - 从头开始使用 NHibernate : tips for a new, 大型应用程序

标签 c# wpf database nhibernate

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

我想要反馈的几件事是:

  • Spring 是个不错的选择吗?我为什么要选择一个不同的(城堡?)。我的启动时间确实有问题,但我已经能够将其恢复到 14 秒。不过,我没有注意到 Spring 和 CaSTLe 之间有太大区别。当然欢迎缩短启动时间;

  • 我正在使用身份字段,但我知道这不是最佳选择。有什么可行的选择;

  • 数据显示是通过短 session 完成的,每个查询一个。另一方面,数据输入在整个工作流持续时间内有一个 session /事务,最长可能需要 10-20 分钟(2-4 分钟更常见)。在整个持续时间内是否有 session /事务的替代方案?我该如何设置?

我对所有人和每一个意见都持开放态度,并且愿意整合那些工作时间更长、使用 NHibernate 的经验比我多的人的想法。

(顺便说一句:我知道我有点不知所措,但这是我喜欢的方式。)

编辑:我对 HiLo 过于苛刻,但经过一些研究后,Guid 似乎更适合我的情况。

最佳答案

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

如果您打算使用 hilo,请确保您了解算法工作原理的详细信息。 (我认为它在本网站的其他地方有描述。)如果您对列或 hilo 的数据类型或“lo”值做出了错误的选择,您最终可能会得到环绕,这将导致生成已使用的数字,这当然很糟糕。

处理数据输入的典型方法是关闭 session ,执行数据输入,然后将更新的对象附加到新 session 。这在文档中有所介绍。

附加的棘手之处在于:假设对象 A 包含对对象 B 的引用,而对象 B 包含对对象 C 的引用。如果您在初始 session 期间“接触”对象 A 和 B,A 和 B 将已经加载,并且 B 将包含对 C 的代理引用。如果您将 A 附加到新 session ,但忘记附加 B,B 的代理引用仍将指向旧的已关闭 session ,如果您尝试将导致异常跟随它。

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

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

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

关于c# - 从头开始使用 NHibernate : tips for a new, 大型应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3711739/

相关文章:

c# - 堆中的 DLL 内存泄漏

wpf - 如何使 WPF 文本框使用密码字符?

c# - LINQ to SQL 类,如何更改列格式? (数据网格)

mysql - 修改 select join 以使用一个查询而不是两个

c# - LINQ to XML - 将节点添加到 .csproj 文件

c# - listBox.ItemContainerGenerator.ContainerFromItem为null

c# - WPF Datagrid 未正确显示数据但在单击列标题时正确显示

database - 如果未安装 Office,为什么 VB.NET Jet 4.0 应用程序会崩溃?

mysql - 从内部连接中只获取一行

c# - Excel VSTO 异步按钮 - 用户交互的奇怪行为?