我正在努力提高现有 Asp.Net Web 应用程序的数据访问层的性能。场景是。
请问我可以在这里得到一些建议吗?
编辑 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/