C # удаленно подключается к базе данных Oracle с помощью DbProviderFactory, ORA-03135: соединение потеряно - PullRequest
0 голосов
/ 16 декабря 2018

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 и приводить к невозможности подключения программы к базе данных, поэтому для освобождения соединения с Oracle используется Connection.Dispose();.

По крайней мере, один раз после сообщения об исключении ORA-03135, функция может быть выполнена снова.И обычный запрос может быть сделан, но в течение некоторого времени снова возникнет исключение ORA-03135.

Что я могу сделать, чтобы полностью решить эту проблему?

Я нашел способ отловить и оценить исключение 0RA-03135 в тот момент, когда функция выдает исключение.Если это исключение 0RA-03135, я снова выполню функцию.Но метод не кажется реальным решением.У вас есть лучшее решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...