System.Data.OracleClient random Неверная операция Соединение закрыто - PullRequest
2 голосов
/ 14 апреля 2011

Мы получаем ошибку от System.Data.OracleClient: Invalid operation. The connection is closed.

Ошибка появляется случайно с частотой около 1 на каждые 1000 операций.

В чем может быть проблема?


Может быть, я получил ответ.

Объект подключения использовался так:

[Serializable] открытый абстрактный класс BaseWizard: IBaseWizard {

    [NonSerialized]
    protected static ISession _session;


    protected static ISession Session
    {

        get
        {
            if (_session == null)
                _session = Session.Create(ConnectionType.DEFINED);
            return _session;
        }
    }
}

(сеанс - это персонализированный объект dbconnection)

и хотя была последняя проверка, если (! Session.IsOpen) Session.Open была вероятность того, что после проверки состояния a перед выполнением команды какая-либо другая операция может закрыть соединение, и, как вы можете видеть, как Объект сеанса является статическим, новая операция обнаружит, что соединение закрыто

Проблема заключается в том, что если соединение не будет статичным, это будет означать добычу открытого соединения / сеанса в БД

Есть ли другой способ исправить это, оставив соединение статичным?

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Остерегайтесь транзакций, именно они вызвали у меня эту проблему:

System.InvalidOperationException: Invalid operation. The connection is closed.
   at System.Data.OracleClient.OracleConnection.GetOpenInternalConnection()
   at System.Data.OracleClient.OracleConnection.get_ErrorHandle()
   at System.Data.OracleClient.OracleDataReader.ReadInternal()
   at System.Data.OracleClient.OracleDataReader.Read()
   at Microsoft.Practices.EnterpriseLibrary.Data.Oracle.OracleDataReaderWrapper.Read()

Время ожидания TransactionScope по умолчанию составляет 60 секунд, но иногда мой процесс записи занимал больше, чем этот (я должендля этого процесса ставим только код для записи в БД, но там много команд чтения).Так что исключение происходило случайно ... Изменение значения тайм-аута делает эту работу.Мне потребовалось так много времени, чтобы понять это, потому что описание ошибки ( Недопустимая операция. Соединение закрыто. ) было неясно связать его с проблемами транзакций.

ДонНе знаю, такая ли у тебя проблема, как у меня, но я так и решил.Надеюсь, это вам как-нибудь поможет.

2 голосов
/ 14 апреля 2011

Ряд условий может привести к неожиданному закрытию соединения.Проблемы с сетью, сборка мусора и т. Д.

Безопаснее заключить команду данных в условное открытие, чтобы убедиться, что у вас хорошее соединение, прежде чем использовать его.

 if (this.mDBConnection.State != System.Data.ConnectionState.Open)
            {
               try
               {
                  this.mDBConnection.ConnectionString = this.mDBConnectionString;
                  this.mDBConnection.Open();
               }
               catch (System.Exception ex)
               {
                  ret = false;         
                  throw ex;
               }
            } 

Пока этоне отвечает на вопрос "Что это вызывает?"мы надеемся, что оно даст решение, которое не даст ему стать дальнейшей проблемой.

Приветствия,

CEC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...