![]() |
1
6
当涉及到每个方法或每个类实例创建一个对象之间的性能差异时,我不会对此担心太多。然而,您在这里似乎忽略了一些关于DataContext类和工作单元模式的重要原则。 DataContext类作为单个工作单元运行。因此,您可以创建一个DataContext,创建对象,更新和删除对象,提交所有更改,然后释放DataContext。您可以为每个请求创建多个DataContext类,每个(业务)事务一个。但是在ASP.NET中,您不应该创建在Web请求之后仍然存在的DataContext。请求期间创建的所有数据上下文都应在该请求结束时或结束之前释放。这有两个原因。 首先,DataContext具有从数据库中提取的所有对象的内部缓存。长时间使用数据上下文将使其缓存无限增长,并且当您拥有一个大数据库时,可能会导致内存问题。DataContext也会在可能的时候从缓存中返回一个对象,使您的对象很快过时。对另一个DataContext或直接对数据库进行的任何更新和删除操作都可能由于这种过时而不被注意。 不缓存数据上下文的第二个原因是它们不是线程安全的。最好将数据上下文视为工作单元或(业务)事务。创建一组新对象,将它们添加到数据上下文,更改其他对象,删除一些对象,完成后,调用SubmitChanges。如果另一个请求在该操作期间调用同一实例上的SubmitChanges,那么您将失去事务的概念。当您允许代码这样做时,在最幸运的情况下,您的新对象将被持久化,您的事务将被拆分为两个单独的事务。最坏的情况是,您将数据上下文或其持久存在的对象保留在无效状态,这可能意味着其他请求失败或无效数据进入数据库。这不太可能是一个场景,我发现在开发人员为每个网站创建一个单一(静态)数据上下文的项目上会发生奇怪的事情。
因此,考虑到这一点,让我们回到您的问题上来。虽然将DataContext定义为实例字段不是问题,但了解如何使用
重要的是要知道
如您所见,我甚至没有讨论您的两个选项中哪一个对性能更好,因为当解决方案给出不一致和不正确的结果时,性能并不重要。 很抱歉我的回答太长了:-) |
![]() |
2
4
你从来都不想储存 DataContext class 在课堂上。如果您这样做,那么您将必须实现 IDisposable interface 在你的班上打电话给 Dispose 方法当你知道你已经完成了。 最好在方法中创建一个新的DataContext并使用 using statement 完成后自动处理。 尽管在DataContext上实现IDisposable没有任何作用,但这是 实施 详细信息,而公开IDisposable接口是 合同 你应该一直遵守。 如果您将linq升级到实体并使用 ObjectContext class 你在哪里 必须 处理完实例后调用Dispose,否则资源将泄漏,直到下次垃圾收集。 |
![]() |
3
1
是的,声明一个类级变量是为了允许整个类访问同一个变量。它不应该被用来试图故意阻止垃圾收集的发生。属性、方法等的访问修饰符用于确定类的外部或内部对象可以使用该代码访问/修改/猴子。 在ASP.NET中,一旦请求发送到浏览器,无论变量是否为公共变量,为该页请求创建的对象将来都将在某个时间点进行CGED。如果希望信息保持在请求之间,则需要创建对象的单例实例,或者将对象序列化为会话或应用程序状态。 |
![]() |
4
1
请参阅以下示例-“Linq to SQL DataContext生存期管理”: http://www.west-wind.com/weblog/posts/246222.aspx 这种方法使生活更简单。 |
![]() |
Eris · 纯虚拟成员有什么优势吗(除了他们可能防止的人为错误)? 2 年前 |
![]() |
AJA SMBAT · 我在获取列表而不是绑定方法时遇到问题 2 年前 |
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 2 年前 |
![]() |
amirreza870 · Python OOP-更改类文本 2 年前 |
![]() |
Rocket Procd · 获取活动类实例的数量 2 年前 |
![]() |
cred · 为什么我请求的变量在从另一个类调用时显示为0.0? 2 年前 |
![]() |
Oliver Guy · 一个类的所有实例共享相同的值 2 年前 |