【问题标题】:C# sql create one connection and open and close for each queryC# sql 创建一个连接并为每个查询打开和关闭
【发布时间】:2015-07-08 19:11:16
【问题描述】:

我最近继承了一个 C# Web 应用程序,它为每个查询创建一个新连接,如下所示:

public class QueryForm
{
    public bool getStudents()
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
        conn.Open();
        //commands
        conn.Close();
    }

    protected void getProfessors()
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
        conn.Open();
        //Commands
        conn.Close();
    }


    protected void getProfessors()
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
        conn.Open();
        //Commands
        conn.Close();
    }
}

我知道这通常是最好的方法,但是让构造函数创建连接对象,然后打开每个方法/查询然后像这样关闭该连接是可以接受的还是“最佳实践”:

public class QueryForm
{
    SqlConnection conn;

    public QueryForm()
    {
        conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
    }

    public bool getStudents()
    {
        conn.Open();
        //commands
        conn.Close();
    }

    protected void getProfessors()
    {
        conn.Open();
        //Commands
        conn.Close();
    }

    protected void getCourses()
    {
        conn.Open();
        //Commands
        conn.Close();
    }
}

我更喜欢第二种方式,因为它不会创建多个连接对象。但是,如果我将方法和类设为静态,第一种方法也更可取。

【问题讨论】:

  • 你可能想检查这个问题stackoverflow.com/questions/861552/…
  • @Gonzalo -- 参考那篇文章,这张海报没有提到将 SqlConnection 设为静态,只有方法和类。
  • 你的问题是什么?
  • @Oluwafemi “让构造函数创建连接对象,然后打开每个方法/查询然后关闭该连接是可以接受的还是“最佳实践””
  • 我明白了。抱歉,太困了……

标签: c# sql sql-server


【解决方案1】:

其中任何一个都可以接受。 SqlConnection 使用连接池,因此它不会对性能产生太大影响。拥有多个 SqlConnection 对象不会造成任何伤害。这归结为偏好。

如果您将连接保留在方法中,我建议将命令封装在 using 语句中,例如:

using (SqlConnection conn = new SqlConnection(...))
{
    conn.Open();
    //commands
    conn.Close();
}

这可确保正确处理连接。

【讨论】:

【解决方案2】:

请务必在尽可能短的时间内保持连接打开。 SQL 连接使用connection pool,因此打开连接实际上在后台重用了连接。 如果您保持连接打开,您可能会遇到错误:'Parallel transactions are not supported' if you use the method BeginTransaction.

这是一个可能有大量连接的网络应用, 让连接对象保持打开更长时间会使您面临耗尽连接池的风险并出现:“在从池中获取连接之前已过超时时间”错误。

此外,即使抛出异常,您也必须确保连接已关闭。

这应该使用 using 块来完成,例如:

using (SqlConnection conn = new SqlConnection(...))
{
    conn.Open();
    //commands
}

因为退出一个“使用”块调用 .Dispose() 对使用的对象。

或者使用 try / catch / finally 块,例如:

SqlConnection conn = null;

try
{
    conn = new SqlConnection(...);    
    conn.Open();
    //commands
}
catch(Exception ex)
{
    ...
}
finally
{
    if(conn != null)
        conn.Close();
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-12-25
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2013-05-09
  • 2012-01-28
相关资源
最近更新 更多