安装程序
我们有一个.net mvc 4 web服务层,它通过一个web应用程序访问,该应用程序从Server 2008数据库获取数据。
问题
当同时向web服务发出超过5个GET请求时,将向web应用程序返回一个500 Interal Server Error。当我仔细查看.net错误时,我会看到以下内容:
发生错误。 连接没有关闭。连接的当前状态是打开的
异常抛出的C#服务代码:
public class ImageLinkRepository : IImageLinkRepository
{
private SqlConnection cnnSQL = new SqlConnection(...);
public IEnumerable<ImageLink> Get(String userId)
{
ImageLinks = new List<ImageLink>();
// open connection to DB
cnnSQL.Open();
try
{
SqlCommand cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL);
cmmSQL.CommandType = System.Data.CommandType.StoredProcedure;
SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter
{
ParameterName = "@LCIMGLINKUSERID",
Value = userId
});
SqlDataReader rdrSQL = cmmSQL.ExecuteReader();
if (rdrSQL.HasRows)
{
while (rdrSQL.Read())
{
ImageLinks.Add(new ImageLink
{
// set new ImageLink object's properties
imageTopicId = DBReader.SQLString(rdrSQL, "LCIMGLINKIMGTOPICID"),
id = DBReader.SQLInt(rdrSQL, "LCIMGLINKPK"),
recordId = DBReader.SQLString(rdrSQL, "LCIMGLINKRECORDID"),
text = DBReader.SQLString(rdrSQL, "LCIMGLINKTEXT"),
topicId = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICID"),
topicItem = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICITEM"),
url = DBReader.SQLString(rdrSQL, "LCIMGLINKURL"),
user = DBReader.SQLString(rdrSQL, "LCIMGLINKUSERID")
});
}
}
}
// close connection to DB
cnnSQL.Close();
return ImageLinks;
}
}如果连接是打开的,我尝试手动关闭连接,并且只有当连接关闭时才尝试打开连接,它们都不能工作。
我一定做错了什么,当然,服务应该能够同时处理请求。我遗漏了什么?
发布于 2013-08-30 15:35:49
您可能会耗尽SQL连接池。首先,您应该使用SqlCommand、SqlConnection和SqlReaders语句包装using()语句,以确保它们被正确地处理和关闭。
构建为字段的SqlConnection意味着您的控制器必须负责处理它。在方法中构造它更容易,在方法中也可以将其封装在using()中(否则您的类应该实现IDisposable(),依次调用连接上的.Dispose() )。
try
{
using (var cnnSQL = new SqlConnection(...))
{
using (var cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL))
{
cmmSQL.CommandType = System.Data.CommandType.StoredProcedure;
SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter
{
ParameterName = "@LCIMGLINKUSERID",
Value = userId
});
using (var rdrSQL = cmmSQL.ExecuteReader())
{
...
}
}
{
} ...https://stackoverflow.com/questions/18536433
复制相似问题