【发布时间】:2016-06-13 01:19:57
【问题描述】:
请在回答之前阅读整个问题。我很抱歉,我似乎从不写简短的问题......
我支持在 Windows Small Business Server 2011 SP1 机器上运行 SQL Server 2008 R2 的 C# 内部 Web 应用程序。
我们最近遇到了很多 SQL 超时,这里是一个异常示例:
System.Web.HttpUnhandledException:引发了“System.Web.HttpUnhandledException”类型的异常。 ---> System.InvalidOperationException:超时已过期。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open()
我检查了一些东西,其中之一是代码如何处理连接和关闭连接。我在其他线程中读到,在连接中使用 Using 语句就足够了,因为它“......将连接创建包装在 try .. finally 中,并将连接处理调用放在 finally 中”。即使发生异常,连接也会关闭。
所以,我同意并且多年来一直使用这种方法。即使在连接中使用 Using 语句,其他人也建议显式关闭连接。我认为这将是多余的......
然而,我的问题是关于命令对象。其他人为此应用程序编写了一个大型数据库方法库,并且他们(在所有数据库方法中)在 SqlConnection 对象 using 语句之前声明了 SqlCommand 对象。他们还在连接使用语句之前将连接对象分配给命令对象。
在连接使用语句中声明和使用命令对象是更好的做法吗,否则会导致 sql 连接超时(除非其他原因导致 sql 连接超时)?以这段代码为例:
public Musician GetMusician(int recordId)
{
Musician objMusician = null;
SqlConnection con = new SqlConnection(_connectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "selectMusician";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@id", recordId);
using (con)
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
objMusician = new Musician((int)reader["id"]);
objMusician.Name = (string)reader["name"];
}
}
if objMusician != null)
{
objMusician.Albums = Albums.GetAlbums((int)objMusician.ID);
objMusician.Tours = Tours.GetTours((int)objMusician.ID);
objMusician.Interviews = Interviews.GetInterviews((int)objMusician.ID);
}
return objMusician;
}
还知道调用页面中包含尝试捕获,并且该页面将错误记录到我们的日志记录数据库中。我们让异常冒泡到页面上的调用方法,并在那里得到处理。
【问题讨论】:
标签: c# sql sql-server connection-timeout