C#使用DbProviderFactory远程连接到Oracle数据库,ORA-03135:连接丢失

时间:2018-12-16 11:57:16

标签: c# oracle

C#使用DbProviderFactory远程连接到Oracle数据库,但是一段时间后,出现此错误:

  

ORA-03135:连接失去联系

查询代码如下:

public DataTable ExecuteDataTable(string sql, IList<DbParameter> parameters, CommandType commandType)
{
    using (DbCommand command = CreateDbCommand(sql, parameters, commandType))
    {
        try
        {
            using (DbDataAdapter adapter = providerFactory.CreateDataAdapter())
            {
                adapter.SelectCommand = command;
                DataTable data = new DataTable();
                adapter.Fill(data);
                return data;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            try
            {
                if (command.Connection != null)
                {
                    command.Connection.Close();
                    command.Connection.Dispose();//①
                }
            }
            catch (Exception) { }
        }
    }
}

private DbCommand CreateDbCommand(string sql, IList<DbParameter> parameters, CommandType commandType)
{
    DbConnection connection = providerFactory.CreateConnection();
    DbCommand command = providerFactory.CreateCommand();
    connection.ConnectionString = ConnectionString;
    command.CommandText = sql;
    command.CommandType = commandType;
    command.Connection = connection;

    if (!(parameters == null || parameters.Count == 0))
    {
        foreach (DbParameter parameter in parameters)
        {
            command.Parameters.Add(parameter);
        }
    }
    return command;
}

如果该程序长时间与Oracle连接,则Oracle由于超时而关闭连接。如果我不使用Connection.Dispose ();,则DbProviderFactory将始终缓存与Oracle的连接,并导致程序无法连接到数据库,因此它使用Connection.Dispose();释放与Oracle的连接。甲骨文

在报告ORA-03135异常之后至少有一次,该函数可以再次执行。可以进行常规查询,但是一段时间后,将再次引发ORA-03135异常。

我该怎么做才能彻底解决此问题?

我想出了一种在函数产生异常时捕获并判断0RA-03135异常的方法。如果是0RA-03135例外,我将再次执行该函数。但是该方法似乎并不是真正的解决方案。您有更好的解决方案吗?

0 个答案:

没有答案