c# - 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 异常,我会再次执行该函数。但该方法似乎并不是真正的解决方案。你有更好的解决方案吗?
解决方案
推荐阅读
- python - Squish 将应用程序上下文设置为 aut 由 aut under test 启动
- sql - 关于通过使用两个表之间的连接来汇总数据
- c++ - 如何聚合 protobuf 消息
- wordpress - WooCommerce 结帐问题和“返回商店”按钮
- c++ - Cout 和 Cerr 不同步
- java - JPQLqueryFactory 的映射结果到 java map
- reactjs - 反应 stopPropagation 根本不起作用
- elasticsearch - 在具有特定结果集的弹性搜索中按多列分组
- jenkins - 使用 Jenkins 管道自动合并两个代码库
- sql - sql pivot中的月份数据