【发布时间】:2009-09-01 23:25:34
【问题描述】:
我在家里的服务器上有一个 SQL 服务器(它是一个具有 1GB 内存的 Atom 处理器),我用它来存储我的一个或两个应用程序的数据。我想知道是否应该在程序启动时创建一个 DataContext 对象,然后在应用程序的整个生命周期中保留它,或者只在必要时创建连接。如果应用程序突然死掉会怎样?连接是否被清理?
【问题讨论】:
标签: c# .net wpf connection sql-server-express
我在家里的服务器上有一个 SQL 服务器(它是一个具有 1GB 内存的 Atom 处理器),我用它来存储我的一个或两个应用程序的数据。我想知道是否应该在程序启动时创建一个 DataContext 对象,然后在应用程序的整个生命周期中保留它,或者只在必要时创建连接。如果应用程序突然死掉会怎样?连接是否被清理?
【问题讨论】:
标签: c# .net wpf connection sql-server-express
除非您将已打开的 SqlConnection 交给 DataContext 对象,否则 DataContext 将在数据库操作完成后自动关闭数据库连接。所以它不会保持连接打开。您可以通过查看 Reflector 中的 DataContext 类来了解这一点,或者您可以阅读 ASP.NET MVC Tip #34: Dispose of your DataContext(or Don't) 博客文章。因此,即使您的 DataContext 对象继续存在,也不应该有任何打开的数据库连接。
如果您在 DataContext 之外处理数据库连接并使其保持打开状态,那么您真的不应该这样做。通常,您应该在需要的时间和地点创建和使用资源,包括 DataContext 对象。无需在没有任何需求的情况下保持数据库连接打开,关闭它以便将其释放回池中以服务另一个数据库连接请求。正如我所说,如果您让 DataContext 处理数据库连接,那么就数据库连接而言,您不需要做任何特别的事情。
如果您的应用程序突然崩溃并终止,您应该没问题,因为一切都会消失,包括打开的数据库连接和与您的应用程序域关联的底层连接池。
【讨论】:
在需要时调出数据上下文,完成后将其删除。
拥有一个全局数据上下文意味着您必须将其传递给需要它的所有事物。 (您编写的每个需要访问数据库的方法在其签名中都有一个额外的参数)。
如果您决定对您的某个应用程序进行多线程处理,那么拥有单一的全局数据上下文也会变得很痛苦。
【讨论】:
您看过 .NET 中的 SQL 连接池吗?查看http://msdn.microsoft.com/en-us/library/8xx3tyca%28VS.80%29.aspx 的文章。连接池会为您处理所有脏活,并在您的程序发生错误时自动清理。它在重用连接方面非常有效,因此重用连接的开销很小(在程序启动时创建第一个连接仍然具有相同的成本)。对于小型应用程序来说,这可能有点矫枉过正,但对于大型项目来说,这可能是一个好习惯。
【讨论】: