우리는 닷넷 MVC 4 웹 API 서비스 계층을 가지고있는 설정, 즉이 SQL 서버에서 데이터를 가져 오는 웹 응용 프로그램을 통해 액세스 할
2008 데이터베이스
문제 5 개 이상의 GET 요청이 동시에 웹 서비스에 만들어지고있는
하는 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;
}
}
연결이 닫혀 있거나 둘 다 작동하지 않으면 연결을 엽니 다.
서비스가 동시 요청을 처리 할 수 있어야합니다. 내가 틀린 일을해야합니다. 내가 뭘 놓치고 있니?
'사용'블록을 추가하면 문제가 해결되었습니다. 일부 서비스 클래스는 여러 메서드가 정의되어 있으므로 각 메서드 외부에서 연결을 선언하고 동일한 'SQLConnection' 개체를 공유하는 것이 더 합리적 인 것처럼 보였습니다. 난 그냥'IDispoasable()'구현에 대해 몰랐어요. 연결을 닫은 후에'Dispose()'메서드 호출을 추가했지만 항상 500 오류를 웹 응용 프로그램에 반환합니다. 어쨌든, 고마워! – Zengineer
닷넷의 SQL 커넥션 풀링 (SQL Connection Pooling)은 커넥션을 실제로 재사용 할 수있는 환경을 제공합니다. 처음부터 완전히 새로 생성하는 것처럼 보입니다. – STW