ASP.NET网站&单独的线程/多线程中的实体框架

时间:2011-12-21 18:27:28

标签: asp.net entity-framework iis

我们有一个asp.net网站,它使用Entity Framework 4作为SQL Server的ORM Mapper。

数据库功能位于编译为DLL的项目中,因此它不直接包含在网站中。

我们遇到了几个性能问题,因此我们正在寻找一种“神奇的开关”,以减少实现时间和其他弱点。

我有一个理论问题:

是否可以在另一个线程中运行实体框架项目(dll),然后运行网站?我想从IIS工作线程中拆分数据库工作。或者甚至可以多次运行数据库工作程序(dll)? (我们没有使用缓存,因为它没有内置,我们没有找到一个优雅的解决方案。)

提前致谢

编辑:感谢您的回答,但我认为我的观点不够明确。

我正在寻找一种在单独的线程中运行数据库功能的DLL(几乎在每个.aspx(.vb)文件中使用)的方法。我不知道如何在另一个线程上运行dll,因为它只是导入而不是“启动”。

在创建上下文并在新线程中创建上下文之前,是否可以运行新线程?在我们的解决方案中,上下文与当前的httpcontext一样长。

6 个答案:

答案 0 :(得分:2)

线程几乎从不是“魔术转换”。应用程序通常必须编写为多线程,并且试图强制单线程应用程序是多线程的,这是灾难的一个秘诀。

我甚至不确定你希望通过多线程获得什么。对象仍然必须在单个线程上实现,无论它是您的主线程还是工作线程,它仍然需要相同的时间。

答案 1 :(得分:1)

SQL分析是将EF用于除了简单查询之外的任何过程中的必要步骤。

答案 2 :(得分:0)

(限制新用户的链接数量 - 因此多部分回答)

表现(一般而言)

一些指导

  1. MSDN Performance Considerations
  2. P&P Chapter 6 — Improving ASP.NET Performance
  3. 1 - 反过来又链接到“探索ADO.NET实体框架的性能” 这解释了几个选项,如编译查询,延迟加载,无跟踪等。

    2 - 一般的aproaches,如众多内置缓存选项(也许?在某种程度上足够优雅)和使用线程的方式。

答案 3 :(得分:0)

ASP.NET

使用ASP.NET Web应用程序中的实体框架最大化性能 - http://www.asp.net/web-forms/tutorials/continuing-with-ef/maximizing-performance-with-the-entity-framework-in-an-asp-net-web-application

解释了分析生成的查询的几个选项和方法

实体框架常见问题解答 - http://www.ef-faq.org/objectcontext.html 见3.2。在Entity Framework上运行多线程应用程序的建议是什么?实体框架是否是线程安全的? :

  

与.NET框架的大多数其他部分一样,实体框架基本上不是线程安全的。因此,如果您想要从多个线程与Entity Framework或您的实体类进行交互,那么您必须特别注意并发问题。一个适用于某些情况的简单模型是每个线程维护自己的上下文,因此不需要锁定。当然,这意味着线程之间的交互必须非常有限(例如,您不能在不小心的情况下将实体从一个线程传递到另一个线程),但是尽管存在这些限制,您仍可以执行一些有用的操作。例如,您可以使用MergeOption.NoTracking在一个线程上检索数据,然后将数据分成组并将其交给其他线程,这些线程将实体附加到自己的线程上下文,进行更新,然后保存。

     

您还可以为所有数据库交互创建一个线程,并将实体发送到其他线程进行处理,然后返回数据库线程进行保存。在这种情况下,确保实体在其他线程上更新时与上下文分离,否则您将最终遇到竞争条件,因为状态管理器正在跟踪所有这些更改,因此从多个隐式使用线程同时。

答案 4 :(得分:0)

对于你的理论问题

  1. 可以在另一个线程中运行实体框架项目(dll),然后运行网站
  2. 是:通过在N层应用程序中处理另一个项目中的查询消息并将填充的对象从项目B发送到项目A;更多信息

    N层申请 - http://msdn.microsoft.com/en-us/magazine/ee321569.aspx

    使用EF4构建N层应用 - http://msdn.microsoft.com/en-us/magazine/ee335715.aspx

    2多次运行数据库工作程序(dll) “是”,答案与1相同。

    //希望这有帮助。

答案 5 :(得分:0)

您可以考虑用微型ORM替换EF,例如Dapper-Dot-Net,它要快得多。你可以在这个网站上找到关于Dapper的大量信息。