在sqlConnections上使用'Using'有什么性能影响

时间:2009-10-15 11:44:36

标签: c# sql performance

我遇到了一个article说我正在使用我的sqlConnection:

using (SqlConnection sqlConnection = new SqlConnection(Config.getConnectionString()))
            {
                using (SqlDataAdapter dataAdapter = new SqlDataAdapter(query, sqlConnection))
                {
                    dataAdapter.Fill(dataSet);
                }
            }

提高了性能,因为它将对象放在方法的末尾。所以我一直在使用'使用'一段时间,在与其他开发人员聊天后,他们说多次创建和销毁实例不会真正提高性能。

如果我在所有dataAccess方法上使用'Using',那么对sqlserver和系统资源的性能影响是什么?由于连接多次连接和重新连接,sqlServer是否会受到更严重的打击?

6 个答案:

答案 0 :(得分:12)

默认情况下,

SqlConnection已启用连接池。 Dispose()只是更快地释放与池的连接。这意味着其他代码可以重新使用此连接,减少与SQL Server的连接,并减少建立物理连接的时间。

是的:它可以提高整体的性能。

备选方案:

  • 如果您的代码干净利落,并且您始终记住Close()连接,那么可能没什么区别
  • 如果您的代码抛出异常(您尚未处理),或者忘记Close()连接,那么您可能会留下未使用的连接,直到有足够的内存压力触发GC和终结器。这可能意味着您需要与SQL服务器建立更多物理连接(痛苦),并且每次需要 new 底层连接时,都必须考虑建立实际数据库连接

总体而言, - 将IDisposable视为合同;作为.NET开发人员,您的作业注意IDisposable资源,并在完成后主动Dispose(),如果用法紧密,最好是using范围(就像在这种情况下)。

答案 1 :(得分:3)

在大多数情况下,它对性能没有显着影响。

所有using()....构造确保SqlConnection在完成其工作后被释放/处置。这就是全部 - 没有神奇的性能提升......

当然 - 创建和处理对象确实会花费一些性能 - 或者是这样,或者你不必要地将对象保留在内存中并且与SQL Server的连接打开的时间比需要的时间长得多。

我会投票在100%的时间内使用using() {...}方法 - 它更干净,更安全,它只是更好的编程习惯。你可能采取的“打击”性能微乎其微,不值得麻烦。

马克

答案 2 :(得分:0)

它提高了的性能,因为在处理完连接实例后,池中的物理连接可以被另一个线程重用。如果你保持打开状态,那么另一个试图打开连接的线程会向池中添加一个新的物理连接。

答案 3 :(得分:0)

ADO.NET具有连接池等功能,因此如果您密集打开连接,很可能不会处理连接,只返回池中。

答案 4 :(得分:0)

如果您在彼此之后进行多个数据库操作,则应使用相同的连接,而不是为每个连接创建一个连接。否则,您应该尽快关闭连接,以便将其返回到连接池并可以重复使用。

您应始终使用using块进行连接,以确保它们已正确关闭。如果您无法关闭连接对象,它将保留在内存中,直到垃圾收集器将其删除,从而占用数据库连接。这意味着下一个opreation不能重用池中的连接,但它必须建立一个全新的连接,这需要更长的时间。

答案 5 :(得分:0)

性能有所改善。

如果您使用 using

例如:

using (SqlConnection sqlConnection = new SqlConnection("ConnectionString"))
    {
    }

编译器自动添加try和finally。

alt text http://img111.imageshack.us/img111/4514/using.jpg