我有一个简单的静态类,其中包含一些方法。每个方法都打开一个SqlConnection,查询数据库并关闭连接。这样,我确信我总是关闭与数据库的连接,但另一方面,我不喜欢总是打开和关闭连接。下面是我的方法的示例。
public static void AddSomething(string something)
{
using (SqlConnection connection = new SqlConnection("..."))
{
connection.Open();
// ...
connection.Close();
}
}
考虑到方法在静态类中,我是否应该有一个包含单个SqlConnection的静态成员?我该如何以及何时放弃它?什么是最佳实践?
答案 0 :(得分:45)
不,除非必须,否则不要保持静态SqlConnection
。线程是一个问题,但更重要的是 - 通常你根本不需要。使用您提供的代码,内部连接池意味着大多数情况下您将在后续调用中获得相同的底层连接(只要您使用相同的连接字符串)。让小伙子做好自己的工作;留下代码。
这也避免了当你开始拥有两个线程时会发生什么问题...现在每个线程都可以在自己的连接上工作;使用静态(假设您不使用[ThreadStatic]
),您必须同步,引入延迟。更不用说重入(即单个线程试图同时使用相同的连接两次)。对;保持代码单独。它现在很好,几乎你所做的任何改变都会让它变得不好。
答案 1 :(得分:19)
因为在调用Open()和Close()时SqlConnection有一个连接池,所以实际上并没有打开和关闭与服务器的物理连接。您只是从可用连接池中添加/删除连接。因此,尽可能晚地打开连接并在执行命令后尽早关闭连接是一种良好的最佳做法。
答案 2 :(得分:5)
在您的代码示例中,不需要在连接对象上调用close()方法,因为代码驻留在using块中会自动处理。
答案 3 :(得分:3)
大多数程序员都认为开放时间较晚,而且很早就关闭。如果每次打开和关闭连接的延迟导致整个应用程序变慢,这只是一个问题。
在使用静态类的情况下,最好每次都打开和关闭连接。
答案 4 :(得分:1)
您正在做最佳做法。只在您查询之前打开它,并尽快关闭它。这种事情起初可能看起来很浪费,但实际上它使您的应用程序在长期内更具可扩展性。
答案 5 :(得分:-1)
不要依赖连接来关闭自己。如果没有明确关闭,则会导致性能问题。它发生在我们的项目上。是的,我知道连接是由连接池管理的,但它们仍然必须关闭并返回池中。