System.Data.OracleClient random Invalid操作关闭连接



System.Data.OracleClient: Invalid operation. The connection is closed.出现错误

错误随机出现,发生率约为1/1000。

有什么问题吗?


也许我知道答案了。

连接对象是这样使用的:

(序列化)公共抽象类BaseWizard: IBaseWizard{

    [NonSerialized]
    protected static ISession _session;

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

(Session是一个个性化的dbconnection对象)

,即使后面有检查if (!Session. isopen) Session。打开有可能在运行命令之前检查状态a之后,一些其他操作可能会关闭连接,并且正如您所看到的Session对象是静态的,新操作将发现连接已关闭

问题是,如果连接不是静态的,这将意味着数据库中打开的连接/会话的掠夺

是否有另一种方法来解决这个问题,使连接保持静态?

注意事务,它们是导致我出现这个问题的原因:

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秒,但我的记录过程有时会超过这个时间(我应该只在这个过程中写代码到DB,但是有很多读取命令)。所以异常是随机发生的……更改超时值可以使其工作。我花了很长时间才弄清楚,因为错误的描述(无效的操作。连接已关闭。)不清楚将其与事务问题联系起来。

我不知道你的问题是否和我的一样,但我就是这样处理的。

有许多情况可能导致连接意外关闭。网络问题,垃圾收集等

将data命令包装在条件打开中更安全,以确保在使用它之前有良好的连接。

 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

最新更新