“打开/closures”SqlConnection或保持打开?

我用静态方法在简单的静态类中实现了我的业务逻辑。 每种方法在调用时打开/closuresSQL连接:

public static void AddSomething(string something) { using (SqlConnection connection = new SqlConnection("...")) { connection.Open(); // ... connection.Close(); } } 

但我认为避免打开和closures连接可以节省性能 。 我之前用OleDbConnection类做了一些testing(不确定关于SqlConnection),而且它确实有助于像这样工作(据我所知):

 //pass the connection object into the method public static void AddSomething(string something, SqlConnection connection) { bool openConn = (connection.State == ConnectionState.Open); if (!openConn) { connection.Open(); } // .... if (openConn) { connection.Close(); } } 

所以问题是 – 我应该select方法(a)还是方法(b)? 我读了另一个stackoverflow的问题,连接池为我保存的性能,我不必打扰所有…

PS。 这是一个ASP.NET应用程序 – 连接仅在networking请求期间存在。 不是一个赢得应用程序或服务。

坚持select一个

连接池是你的朋友。

每次使用方法(一)。 当你开始扩展你的应用程序时,如果你不这样做,处理这个状态的逻辑将会变成真正的痛苦。

连接池做它在锡上说的。 想想应用程序扩展时会发生什么,手动pipe理连接打开/closures状态有多困难。 连接池会自动处理这个问题。 如果担心性能的话,可以考虑某种内存caching机制,以免被阻塞。

请务必尽快closures连接,以便底层数据库连接可以返回到池中,并可供其他呼叫者使用。 连接池是非常好的优化,所以没有明显的惩罚这样做。 build议与交易基本相同 – 完成后保持简短。

如果通过使用多个连接的代码围绕单个事务运行MSDTC问题,则会变得更加复杂,在这种情况下,您实际上必须共享连接对象,并且只有在事务完成时才closures连接对象。

但是你在这里手工做事,所以你可能想要调查为你pipe理连接的工具,比如DataSets,Linq to SQL,Entity Framework或者NHibernate。

免责声明:我知道这是旧的,但我发现一个简单的方法来certificate这一事实,所以我把我的两分钱的价值。

如果你不敢相信汇集会更快,那么试试这个:

添加以下某处:

 using System.Diagnostics; public static class TestExtensions { public static void TimedOpen(this SqlConnection conn) { Stopwatch sw = Stopwatch.StartNew(); conn.Open(); Console.WriteLine(sw.Elapsed); } } 

现在用TimedOpen()replace所有的调用Open() TimedOpen()并运行你的程序。 现在,对于每个不同的连接string,控制台(输出)窗口将有一个长时间运行的打开,并打开一堆非常快。

如果你想标记它们,你可以添加new StackTrace(true).GetFrame(1) +WriteLine的调用。

物理和逻辑连接有区别。 DbConnection是一种逻辑连接,它使用到Oracle的底层物理连接。 closures/打开DbConnection不会影响你的性能,但是使你的代码干净而稳定 – 在这种情况下连接泄漏是不可能的。

另外你应该记住在db服务器上并行连接有限制的情况 – 考虑到这一点,有必要使连接非常短。

连接池让你免于连接状态检查 – 只需打开,使用并立即closures它们。