none
ADO.NET Pooling에 대해 문의드립니다. RRS feed

  • 질문

  • ASP.NET 사이트를 운영중입니다.

    제한 시간이 만료되었습니다. 풀에서 연결을 만들기 전에 제한 시간이 경과되었습니다. 풀링된 연결이 사용 중이었거나 최대 풀 크기에 도달했기 때문일 수 있습니다.

    상기 에러로 대응중인데요.

    DB Connection 풀링 관련 옵션에서 MaxPoolSize, MinPoolSize 의 수를 가감해도 해당 에러가 비정기적으로 나옵니다.

    기타 옵션도 대부분 테스트해 보았구요.

    마지막으로 Pooling=false 로 풀링 사용을 안하는 것으로 변경했더니 상기 에러가 안 나오네요.

    사이트에 사용자가 급증한 상태도 아니고, 갑자기 에러 상항이 발생했었습니다.

    이 상황에 대해 설명을 해 주실만한 분 계시면 도움 부탁드립니다.

    향후 어떻게 해야 할지도 조언 부탁드립니다.

    2012년 4월 10일 화요일 오전 8:02

모든 응답

  • 안녕하십니까? Andyadic 님,
    Microsoft MSDN의Forum 사이트를 방문해 주셔서 감사합니다.

    문의 하신 ”ADO.NET Pooling에 대해 문의드립니다.”에 대해 답변드리겠습니다.

    제 생각에는 발생한 에러 부분에 관한 log를 확인해야지만 조언이 가능할 것 같습니다.
    Log 확인 후 응답 부탁드립니다.

    2012년 4월 12일 목요일 오전 6:25
    중재자
  • 네 다음과 같이 로그를 남겼는데요.

    오류 종류가 세가지 정도 됩니다.

    오류 메시지에는 SQL Server 2005라고 되어 있지만 실제는 SQL Server 2000입니다.

    AbstracBeanDAO는 DB Helper 정도로 봐 주시면 될 거 같습니다.

    조언 부탁드립니다

    17:07:43 제한 시간이 만료되었습니다. 풀에서 연결을 만들기 전에 제한 시간이 경과되었습니다. 풀링된 연결이 사용 중이었거나 최대 풀 크기에 도달했기 때문일 수 있습니다.
    Source = System.Data
    StaceTrace =    위치: System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       위치: System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       위치: System.Data.SqlClient.SqlConnection.Open()
       위치: AbstracBeanDAO.FatechQuery(String Query)

    17:10:16 서버에 연결하는 동안 오류가 발생했습니다. SQL Server 2005에 연결하는 경우 SQL Server 기본 설정에서는 원격 연결을 허용하지 않기 때문에 발생한 오류일 수 있습니다. (provider: 명명된 파이프 공급자, error: 40 - SQL Server에 대한 연결을 열 수 없습니다.)
    Source = .Net SqlClient Data Provider
    StaceTrace =    위치: System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       위치: System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       위치: System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       위치: System.Data.SqlClient.SqlConnection.Open()
       위치: AbstracBeanDAO.FatechQuery(String Query)

    17:49:22 제한 시간이 만료되었습니다. 작업을 완료하기 전에 제한 시간이 경과되었거나 서버가 응답하지 않았습니다.
    Source = .Net SqlClient Data Provider
    StaceTrace =    위치: System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       위치: System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       위치: System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       위치: System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       위치: System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
       위치: System.Data.SqlClient.SqlDataReader.get_MetaData()
       위치: System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
       위치: System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
       위치: System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
       위치: System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
       위치: System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
       위치: System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)
       위치: AbstracBeanDAO.FatechProc2(String ProcName, IDataParameter[] parameters)

        public SqlDataReader FatechQuery(string Query)
        {
            SqlDataReader fatechReader = null;

            try
            {
                // 수정
                this.mDbConn = new SqlConnection(GetDSN);
                this.mCmd = new SqlCommand();
                this.mCmd.Connection = this.mDbConn;
                this.mCmd.CommandType = CommandType.Text;
                this.mCmd.CommandTimeout = 600;
                this.mCmd.CommandText = Query;

                if (this.mCmd.Connection.State != ConnectionState.Open)
                    this.mCmd.Connection.Open();
                // 수정

                fatechReader = mCmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception e)
            {
                DbErrorMsg(e.Source, e.Message, e.StackTrace, Query);
            }
            finally
            {
                if (mCmd != null)
                    mCmd.Dispose();
            }

            return fatechReader;

        }

        public SqlDataReader FatechProc2(string ProcName, IDataParameter[] parameters)
        {
            SqlDataReader mReader1 = null;
            try
            {
                this.mDbConn = new SqlConnection(GetDSN2);
                this.mCmd = new SqlCommand();
                this.mCmd.Connection = this.mDbConn;
                this.mCmd.CommandTimeout = 600;
                this.mCmd.CommandText = ProcName;

                if (mCmd.Connection.State != ConnectionState.Open)
                    mCmd.Connection.Open();

                this.mCmd = BuildProcCommand2(ProcName, parameters, this.mDbConn);


                this.mCmd.CommandType = CommandType.StoredProcedure;
                mReader1 = mCmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception e)
            {
                DbErrorMsg(e.Source, e.Message, e.StackTrace, "Procedure FatechProc Error");
            }

            return mReader1;
        }

    2012년 4월 27일 금요일 오전 1:38
  • execute를 하시고 나서

    fatechReader.Close();

    mReader1.Close();

    mDbConn.Close(); 를 항상 해주셔야할것 같습니다.

    2012년 7월 13일 금요일 오전 8:12