[英].net mvc 4 web api service connection to SQL Server issue
設置
我們有一個.net mvc 4 Web api服務層,可通過Web應用程序訪問該服務,該應用程序從SQL 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;
}
}
我嘗試手動關閉連接(如果打開),並且嘗試僅打開連接(如果關閉),但它們都不起作用。
我一定做錯了,當然,該服務應該能夠處理並發請求。 我想念什么?
您可能會耗盡SQL連接池。 首先,您應該using()
語句包裝SqlCommand
, SqlConnection
和SqlReaders
,以確保正確處理和關閉它們。
被構造為字段的SqlConnection
意味着您的控制器必須負責處理它。 在方法中構造它更容易,也可以將其包裝在using()
中(否則,您的類應該實現IDisposable()
,依次在Connection上調用.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())
{
...
}
}
{
} ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.