gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:10:07 28 4
gpt4 key购买 nike

我正在努力提高现有 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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com