繁体   English   中英

ASP.NET中的事务和连接池

[英]Tranaction and connection pooling in asp.net

我使用了如下数据库访问代码:

//gets the connection and create transaction
SqlTransaction transaction = SelectConnection();

try
{
    dsRecordDataset = new DataSet();
    SqlParameter[] param = new SqlParameter[1];
    string[] taleNames = new string[1];
    taleNames[0] = "RecordSet";
    param[0] = new SqlParameter("@Mode", Mode);
    SqlHelper.FillDataset(transaction, CommandType.StoredProcedure, 
                          "spProject", dsRecordDataset, taleNames, param);
    transaction.Commit();
    return dsRecordDataset;
}
catch (Exception ex)
{
    transaction.Rollback();
    throw ex;
}

我发现的问题是我从未关闭过连接,因此连接池可能会溢出并有时给用户带来错误。 我需要澄清以下内容

  1. 什么时候根据asp.net中的默认设置重置连接池?
  2. 提交事务与连接有关系吗?

我在尝试catch块后尝试使用以下代码

finally
{
    if (transaction.Connection.State == ConnectionState.Open)
    {
        transaction.Connection.Close();
    }
}

但随后连接为空并给出错误。

  1. 有什么办法可以关闭上面代码中的连接?

什么时候根据asp.net中的默认设置重置连接池?

如果未在连接字符串中指定MinPoolSize或将其指定为零,则一段时间不活动后,池中的连接将关闭。 但是,如果指定的MinPoolSize大于零,则直到AppDomain卸载并且过程结束,连接池才会被销毁。

提交事务与连接有关系吗? 不,提交连接不会(不应)关闭连接

有什么办法可以关闭上面代码中的连接?

您可以使用Connection对象的Close或Dispose方法,或通过在C#中的using语句内打开所有连接,以将它们返回到连接池中来执行此操作。 未显式关闭的连接可能不会添加或返回到池中。

您已经找到了答案,但是对于问题3),在这种情况下,您可能会发现using语句很有趣。 但是,这意味着更改代码,但这是确保资源关键对象安全的好方法。 (例如您的SqlConnection)

using (SqlConnection connection = new SqlConnection(connectionString))  
{  
    SqlCommand command = connection.CreateCommand();  

    command.CommandText = "mysp_GetValue";  
    command.CommandType = CommandType.StoredProcedure;  

    connection.Open();  
    object ret = command.ExecuteScalar();  
} 

这只是一个非常简单的示例,但是此语句自动调用实现IDisposable接口的对象的Dispose方法。 (就像SqlConnection)

如果您对此感兴趣,可以在这里找到更多详细信息和解释: 您的朋友C#Using语句

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM