글로벌 연결 (예 : 글로벌 변수 또는 정적 변수로 정의 됨)을 사용하는 경우 동시에 여러 스레드가 실행되는 환경 (예 : 웹 서버)에서는 작동하지 않습니다.
그 이유는 모든 스레드가 동일한 코드를 거치기 때문입니다. 첫 번째는 연결을 열고 다른 모든 사람들에게도 열려 있습니다.
작업이 완료되는 즉시 로컬로 연결을 정의하고 열고 닫는 것이 가장 좋습니다.
문제
내 페이지에는 리피터로 구성되며 SQL Server 2008의 저장 절차를 사용하여 일부 데이터를 바인딩합니다.
rptTour.DataSource = GetData();
rptTour.DataBind();
데이터 바인딩 getData ()
SqlCommand cmdSelectAllMatch = new SqlCommand("sp_sel_Tour", Global.conn);
SqlDataReader dtrSelectAllMatch = null;
Collection<TourBO> TourData = new Collection<TourBO>();
try
{
Global.connD2W.Open(); //error here, line 23
cmdSelectAllMatch.CommandType = System.Data.CommandType.StoredProcedure;
dtrSelectAllMatch = cmdSelectAllMatch.ExecuteReader();
while (dtrSelectAllMatch.Read())
{
TourBO Tour = new TourBO();
TourID = Convert.ToInt16(dtrSelectAllMatch[dtrSelectAllMatch.GetOrdinal("ID")]);
Tour.Name = dtrSelectAllMatch[dtrSelectAllMatch.GetOrdinal("Name")].ToString();
TourData.Add(Tour);
}
}
catch(Exception ex)
{
Global.Log(ex.ToString());
}
finally
{
Global.connD2W.Close();
}
if (dtrSelectAllMatch != null)
{
dtrSelectAllMatch.Close();
}
return TourData;
이것은 전체 응용 프로그램 중에서 공유 할 SQLConnection입니다.
public static SqlConnection connD2W = new SqlConnection(ConfigurationManager.ConnectionStrings["D2WConnectionString"].ConnectionString);
데이터 리더의 모든 데이터를 읽고 사용자 정의 컬렉션에 할당하고 리피터로 다시 전달합니다.
내가 혼자 테스트 할 때 모든 것이 잘 작동합니다. 그러나 Visual Studio (20 명의 사용자 및 2 분 동안 실행)를 사용하여 손실 테스트를 실행하면 오류 로그 파일에서 아래 오류를 받았습니다 (동일한 오류 유지 반복).
Log Entry : 9:59:05 AM Thursday, November 07, 2013
:System.InvalidOperationException: The connection was not closed. The connection's current state is connecting.
at System.Data.ProviderBase.DbConnectionBusy.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at TourDAL.GetAllScheduledMatch() in c:\Documents\Visual Studio 2010\WebSites\test\App_Code\DAL\TourDAL.cs:line 23
이 기능이 여러 사용자가 동시에 액세스 할 수 없다는 것을 의미합니까? 이것을 해결하는 방법이 있습니까?
해결책
글로벌 연결 (예 : 글로벌 변수 또는 정적 변수로 정의 됨)을 사용하는 경우 동시에 여러 스레드가 실행되는 환경 (예 : 웹 서버)에서는 작동하지 않습니다.
그 이유는 모든 스레드가 동일한 코드를 거치기 때문입니다. 첫 번째는 연결을 열고 다른 모든 사람들에게도 열려 있습니다.
작업이 완료되는 즉시 로컬로 연결을 정의하고 열고 닫는 것이 가장 좋습니다.