我已经在.net Core API项目中建立了与Oracle数据库的连接
我使用this driver连接到Oracle
我的代码:
connection.Open();
using (OracleCommand cmd = connection.CreateCommand()) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "MyPackage.SP";
cmd.Parameters.Add(DbParam(cmd, "id", OracleType.Number, 1));
cmd.Parameters.Add(DbOutParam(cmd, "out_key", OracleType.VarChar, 1024));
try {
cmd.ExecuteNonQuery();
result = cmd.Parameters["out_key"].Value.ToString();
} catch (OracleException oe) {
Console.Out.WriteLine("OracleException: {0}: {1}", Tool.GetCurrentMethod(), oe.Message);
}
connection.Close();
}
我的连接字符串:
Data Source = ORACLE-DEV:1521/pdb;PERSIST SECURITY INFO=True;USER ID=user; Password=password;
有时候,连接消失了,当我获得所有连接后,一个例外:
ORA-01012: not logged on
Process ID: x
Session ID: y Serial number: z
我已经读过question,但是有一个用户通过将“验证连接”设置为true来解决该问题并保持警告状态
作为警告,我引用了Oracle文档。
“验证连接”属性可验证从中发出的连接 游泳池。仅在绝对必要时才应使用此属性 因为它导致服务器往返数据库以验证每个 连接提供给应用程序之前。如果无效 连接不常见,开发人员可以创建自己的事件 处理程序以检索新的连接,而不是使用Validate 连接。通常可以提供更好的性能。
我想知道捕获此类异常后该怎么办以及如何自动重新连接
try {
cmd.ExecuteNonQuery();
} catch (OracleException oe) {
Console.Out.WriteLine("OracleException: {0}", oe.Message);
if (oe.Code == -1012) {
// put your code here
}
}
有什么想法吗?
答案 0 :(得分:1)
在捕获到异常之后,我不会重试执行该查询,该解决方案可能会使您的应用程序运行缓慢且不稳定。
您的代码似乎很简单,可以使用官方驱动程序工作,那么为什么要使用您正在使用的非官方驱动程序?
尝试使用适用于.NET Core的最新Oracle驱动程序:
首先,删除当前的驱动程序,然后使用NuGet或NuGet控制台安装它:
Install-Package Oracle.ManagedDataAccess.Core -Version 2.18.3
答案 1 :(得分:-1)
要回答您的问题,您可以尝试以下操作(简单的示例):
var attempt = 0;
while (attempt < 2)
{
try {
cmd.ExecuteNonQuery();
break;
} catch (OracleException oe) {
Console.Out.WriteLine("OracleException: {0}", oe.Message);
if (oe.Code == -1012) {
connection.Open();
attempt++;
}
}
}
if (attempt == 2) {
// you have a problem!
}
这将尝试,如果已关闭,请打开连接,然后重试。不确定会发生什么,但如果别的东西关闭此连接 - 你需要处理的是适当的外循环
但是,这仅仅是隐藏潜在的问题。