为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑的夜晚无繁华 2019-10-28 10:15:37
我用静态方法在简单的静态类中实现了我的业务逻辑。这些方法中的每一个在调用时都会打开/关闭SQL连接:public static void DoSomething(string something){    using (SqlConnection connection = new SqlConnection("..."))    {        connection.Open();        // ...        connection.Close();    }}但是我认为避免打开和关闭连接会节省性能。不久前,我用OleDbConnection类(不确定SqlConnection)进行了一些测试,它确实可以像这样工作(据我所记得)://pass the connection object into the methodpublic 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或服务。
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

坚持选择a。


连接池是您的朋友。


查看完整回答
反对 回复 2019-10-28
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

每次使用方法(a)。当您开始扩展应用程序时,处理状态的逻辑将变得非常痛苦。

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


查看完整回答
反对 回复 2019-10-28
?
BIG阳

TA贡献1859条经验 获得超6个赞

处理完连接后,请务必立即关闭它们,以便它们的基础数据库连接可以返回到池中,并可供其他调用者使用。连接池的优化非常好,因此这样做没有明显的损失。该建议与交易基本相同-完成后,请保持简短。

如果您在使用多个连接的代码周围使用单个事务遇到MSDTC问题,则情况将变得更加复杂,在这种情况下,您实际上必须共享连接对象,并且仅在完成事务后才关闭它。

但是,您在这里是手工做的,因此您可能需要研究为您管理连接的工具,例如DataSet,Linq to SQL,Entity Framework或NHibernate。


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 570 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信