System.Data.OracleClient random无效操作连接已关闭

时间:2011-04-14 14:07:50

标签: c# oracle

我们收到System.Data.OracleClientInvalid operation. The connection is closed.

的错误消息

错误随机出现,每1000次操作发生率约为1。

可能是什么问题?


也许我得到了答案。

连接对象的使用方式如下:

[序列化] 公共抽象类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.Open也有可能在运行命令之前检查状态a后,其他一些操作可能会关闭连接,正如您所看到的那样Session对象是静态的,新操作会发现连接已关闭

问题是如果连接不是静态的,那将意味着在db中打开连接/会话的战利品

还有另一种方法可以解决此问题,使连接保持静态吗?

2 个答案:

答案 0 :(得分:2)

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

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

 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

答案 1 :(得分:2)

注意交易,他们是导致我这个问题的那些:

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秒,但我的录制过程有时会超过这个(我应该只在这个过程中放入代码写入数据库,但是有很多读取命令)。所以异常是随机发生的......更改超时值会使这项工作成功。我花了很长时间才搞清楚,因为错误的描述(无效操作。连接已关闭。)并不清楚将其与交易问题联系起来。

我不知道你的问题是否与我的问题相同,但这就是我处理的问题。希望它能帮到你。