提高 nHibernate 数据访问层的性能

2024-04-18

我正在致力于提高现有 Asp.Net Web 应用程序的数据访问层的性能。场景是。

  1. 它是一个基于 Asp.Net 的 Web 应用程序。
  2. DataAccess 层使用 NHibernate 1.2 构建并公开为 WCF 服务。
  3. Entity 类用 DataContract 标记。
  4. 不使用延迟加载,并且由于关系的急切,没有大量数据库对象加载到内存中。数据库的点击率也很高。例如,我使用 NHProfiler 分析应用程序,大约有 50 多个 sql 调用使用主键加载实体对象之一。
  5. 我也无法更改太多代码,因为它是一个现有的实时应用程序,根本没有 NUnit 测试用例。

请问我可以在这里得到一些建议吗?

编辑1:我尝试使用延迟加载,但问题是,由于实体也用作 DataContract,它会在序列化期间触发延迟加载。 使用 DTO 对象是一种选择,但这是一个巨大的变化,因为没有很大的实体。如果没有测试用例,这将需要大量的手动测试工作。

编辑2:该项目是很久以前编写的,没有编写单元测试的灵活性。例如 实体本身包含CRUD操作并使用NHibernate Session。

class SampleEntity : ICrudOperation
{
   //fields and properties

   public IList<SampleEntity> Update()
    {

       //perform business logic (which can be huge and call the ICrudOperation of 
       //other entities

       ISession session = GetSessionFromSomewhere();
       session.Update(this); 

    }

}

这只是更新的一个示例。大约有 400 个相互依赖的实体。有没有办法为此编写单元测试


看来这里的架构确实可以改进。

主要问题似乎是正在读取大量数据。是否需要读取所有这些数据?例如,如果实体 A 有一个正在急切加载的子元素 B 列表,但页面上仅显示实体 A 的字段,则仅需要读取实体 A。如果页面上显示了所有内容,请考虑重新设计页面,以便您必须导航到其他页面才能查看实体 B 数据。

假设您只显示来自实体 A 的数据,或者可以重新设计网站来执行此操作,那么第一件事就是打开子实体的延迟加载,这样您只需在确实需要时才需要读取它们需要数据。其次,如果您继续返回实体本身,则打开延迟加载将不会产生任何效果,因为当序列化程序序列化您的数据时,子实体仍将被读取。您需要引入一些数据传输对象 (DTO) 来通过线路传递数据。这些将与您的实体类似,但仅包含您实际想要在网页上使用的数据的字段。然后,您需要将实体转换为 DTO,这意味着由于您不会访问不需要的子实体列表,并且配置了延迟加载,因此不会读取该数据。

值得研究升级到最新版本的 NHibernate,尽管没有单元测试,这可能会很可怕,但绝对值得。

引入二级缓存可能效果很小,因为当您在分布式环境中获得大量命中时,这确实会产生影响。你有更根本的问题需要首先解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提高 nHibernate 数据访问层的性能 的相关文章

  • 与 Java 7 相比,Java 8 ScriptEngine 的主要性能问题

    我有一个 Java 程序 使用 JDK 7u80 编译 它广泛使用了 JavaScript ScriptEngine JSR 223 我注意到 与 Java 7 运行时环境 JRE 7u80 相比 我的程序在 Java 8 运行时环境 JR
  • 高效快速的线程参数方法

    创建带参数的线程最有效的方法是什么 参数是一个结构体 如果该结构体不能保留在父线程堆栈上 有两种解决方案 具有动态内存分配 struct Arg int x int y void my thread void v arg Arg arg A
  • ProviderManifestToken 2008 或 2012

    应用程序 NET 4 5 C 使用 EF6 和数据库优先方法 支持 SQL Server 2008R2 2012 和 2014 这个问题是关于ProviderManifestToken自动生成的 edmx 文件的属性 根据使用哪个版本的数据
  • 确保 HttpConfiguration.EnsureInitialized()

    我已经安装了 Visual Studio 2013 当我运行我的应用程序时 出现以下错误 我不知道在哪里初始化这个对象 该怎么办 Server Error in Application The object has not yet been
  • 如何从 ModelState 键中删除前缀?

    例如 有一个Web Api操作方法 public HttpMessageResponse Post UserDto userDto if this ModelState IsValid return this Request CreateE
  • 找出最后获得焦点的控件

    我有一个带有几个文本框和一个按钮的 C Windows 窗体应用程序 我想找出具有焦点的文本框并用它做一些事情 我已经编写了以下代码 但它当然不起作用 因为按钮一旦按下就会获得焦点 private void button1 MouseDow
  • C# vb:S​​ystem.Func 占用多少内存?

    System Func 究竟拥有多少内存 System Func 是 1 行还是 1000 行有什么区别吗 Func是委托类型 一个实例在x86抖动中占用32字节存储 对象头 8 个字节 4 个字节用于 Delegate methodBas
  • 这是可插拔组件本地化的好解决方案吗?

    我问了一个question https stackoverflow com questions 1504363 how should i localise pluggable components以前只有一个答案 我现在已经花了一些时间来研
  • 线程与并行处理

    Microsoft NET 4 0 为其框架引入了新的 并行增强功能 我想知道使用标准 System Threading 函数与新的并行增强功能创建应用程序之间有什么区别 并行扩展和常规线程之间最重要的区别可能是控制流 一个线程 使用创建n
  • 时间:2019-03-17 标签:c#usbdecision

    我们当前的应用程序中有几个进程 一个进程处理 USB 加载程序的检测和删除 处理检测和删除的代码如下 protected override void WndProc ref Message m switch m Msg case Win32
  • 编译 32 位和 64 位时性能差异巨大(快 26 倍)

    我试图衡量使用的差异for and a foreach访问值类型和引用类型的列表时 我使用以下课程来进行分析 public static class Benchmarker public static void Profile string
  • 在 C# 中创建文件的最快方法

    我正在运行一个程序来测试在包含大量文件的文件夹中查找和迭代所有文件的速度 该过程中最慢的部分是创建超过 100 万个文件 我目前正在使用一种非常幼稚的方法来创建文件 Console Write Creating 0 N0 file s of
  • 使用 .NET 类进行 OpenSSL 加密

    我希望创建一个使用与 OpenSSL 兼容的 NET 库的类 我知道有一个 OpenSSL Net 包装器 但我希望避免引用第 3 方 非托管代码 我并不是要讨论这是否是正确的选择 但这是有原因的 目前我有以下内容 我认为它应该与 Open
  • 如何在 .net 中为 Google 云存储签名 url

    我想知道如何使用 net中的谷歌云存储类生成signurl 我已经根据要求创建了字符串 GET 1388534400 bucket objectname 但我现在想用 p12 密钥签署这个 url 然后想让它变得 url 友好 该库没有显示
  • WCF 复杂 JSON 输入错误(无法通过 QueryStringConverter 转换)

    我在将复杂 JSON 作为 WCF 服务中的参数工作时遇到问题 在 Visual Studio 2008 SP1 中使用 Microsoft Net 3 5 SP1 签订以下合同 ServiceContract public interfa
  • C# 单元测试:测试使用 MapPath 的方法

    首先 我知道这个问题非常接近 如何在 C 单元测试中映射路径 https stackoverflow com questions 1231860 how to mappath in a unit test in c 但我希望它有不同的解决方
  • 使用 For 循环进行异步和等待 [重复]

    这个问题在这里已经有答案了 我有一个 Windows 服务 它根据计划运行各种作业 确定要运行哪些作业后 将调度对象列表发送到迭代列表并运行每个作业的方法 问题是 由于外部数据库调用 某些作业可能需要长达 10 分钟才能运行 我的目标是不让
  • 位置 0 处没有行

    cmd CommandText select from product where prod code Trim txtprod code Text and branch w location and avail stock lt gt 0
  • jQuery $.ajax 调用 WCF 服务返回 400 错误请求

    更新在最后 我正在使用不熟悉的技术来实现一个想法 我写过一些WCF服务 但从未做过任何高级配置 这是我第一次深入了解 jQuery 前提是我创建一个WCF服务来获取分支信息 由jQuery检索 我的第一次搜索产生了这个页面 http www
  • 提高UDP可靠性

    我正在构建一个基于 UDP 的小型服务器 服务器基于 Net并使用它自己的Socket类 我通过 ReceiveMessageFromAsync 和异步发送使用完成端口 我的问题是我失去了大约 5 10 的流量 现在我明白这是正常的 但是有

随机推荐