“打开/关闭” SqlConnection还是保持打开状态?

我用静态方法在简单的静态类中实现了我的业务逻辑。这些方法中的每一个在调用时都会打开/关闭SQL连接:


public static void DoSomething(string something)

{

    using (SqlConnection connection = new SqlConnection("..."))

    {

        connection.Open();


        // ...


        connection.Close();

    }

}

但是我认为避免打开和关闭连接会节省性能。不久前,我用OleDbConnection类(不确定SqlConnection)进行了一些测试,它确实可以像这样工作(据我所记得):


//pass the connection object into the method

public static void DoSomething(string something, SqlConnection connection)

{

    bool openConn = (connection.State == ConnectionState.Open);

    if (!openConn)

    {

        connection.Open();

    }


    // ....


    if (openConn) 

    {

        connection.Close();

    }

}

所以问题是-我应该选择方法(a)还是方法(b)?我读到另一个stackoverflow问题,即连接池为我节省了性能,我完全不必费心...


PS。这是一个ASP.NET应用程序-连接仅在Web请求期间存在。不是Win-App或服务。


慕尼黑的夜晚无繁华
浏览 571回答 3
3回答

潇湘沐

坚持选择a。连接池是您的朋友。

至尊宝的传说

每次使用方法(a)。当您开始扩展应用程序时,处理状态的逻辑将变得非常痛苦。连接池按锡说的做。只需考虑一下在应用程序扩展时会发生什么,以及手动管理连接打开/关闭状态会有多困难。连接池在自动处理此方面做得很好。如果您担心性能,请考虑使用某种内存缓存机制,以防止任何阻塞。

BIG阳

处理完连接后,请务必立即关闭它们,以便它们的基础数据库连接可以返回到池中,并可供其他调用者使用。连接池的优化非常好,因此这样做没有明显的损失。该建议与交易基本相同-完成后,请保持简短。如果您在使用多个连接的代码周围使用单个事务遇到MSDTC问题,则情况将变得更加复杂,在这种情况下,您实际上必须共享连接对象,并且仅在完成事务后才关闭它。但是,您在这里是手工做的,因此您可能需要研究为您管理连接的工具,例如DataSet,Linq to SQL,Entity Framework或NHibernate。
打开App,查看更多内容
随时随地看视频慕课网APP