我们收到System.Data.OracleClient
:Invalid 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中打开连接/会话的战利品
还有另一种方法可以解决此问题,使连接保持静态吗?
答案 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秒,但我的录制过程有时会超过这个(我应该只在这个过程中放入代码写入数据库,但是有很多读取命令)。所以异常是随机发生的......更改超时值会使这项工作成功。我花了很长时间才搞清楚,因为错误的描述(无效操作。连接已关闭。)并不清楚将其与交易问题联系起来。
我不知道你的问题是否与我的问题相同,但这就是我处理的问题。希望它能帮到你。