[英]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;
}
我发现的问题是我从未关闭过连接,因此连接池可能会溢出并有时给用户带来错误。 我需要澄清以下内容
我在尝试catch块后尝试使用以下代码
finally
{
if (transaction.Connection.State == ConnectionState.Open)
{
transaction.Connection.Close();
}
}
但随后连接为空并给出错误。
什么时候根据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.