.net - 提高 nHibernate 数据访问层的性能

标签 .net wcf performance nhibernate data-access-layer

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

  • 它是一个基于 Web 的 Asp.Net 应用程序。
  • 数据访问层使用 NHibernate 1.2 构建并作为 WCF 服务公开。
  • Entity 类用 DataContract 标记。
  • 不使用延迟加载,并且由于关系的急切获取,内存中没有加载大量数据库对象。数据库的命中率也很高。例如,我使用 NHProfiler 分析了应用程序,并且有大约 50 多个 sql 调用使用主键加载实体对象之一。
  • 我也无法更改代码,因为它是一个根本没有 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 虽然没有单元测试这可能会很可怕但绝对值得。

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

    关于.net - 提高 nHibernate 数据访问层的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2662428/

    相关文章:

    wcf - Wcf 服务中的错误 SPContext

    c# - .NET 线程池是否应该在启动时创建最少数量的工作线程?

    .net - 何时使用异步模式处理 wcf 对象

    c# - 如何确定是否正在处理 .NET 异常?

    wcf - DbContext、EF 和 LINQ - 通过接口(interface)在 DbContext 上公开方法的最佳方式是什么?

    java - 将元素添加到根据其成本递增自动正确的位置,并获得最佳性能

    javascript - 处理大量数据的最佳方法

    jquery - 有没有更好的方法使用 jQuery 按类查找单个元素?

    c# - 切换选项卡时关注控件

    c# - 如果使用 Task.Delay,Task.WhenAll 的行为会有所不同