首页 > 解决方案 > C# 使用 DbProviderFactory 远程连接到 Oracle 数据库,ORA-03135:连接失去联系

问题描述

C# 远程连接到 Oracle 数据库DbProviderFactory,但一段时间后,我收到此错误:

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 异常,我会再次执行该函数。但该方法似乎并不是真正的解决方案。你有更好的解决方案吗?

标签: c#oracle

解决方案


推荐阅读