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