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, я снова выполню функцию.Но метод не кажется реальным решением.У вас есть лучшее решение?