我在docker中有一个.net Core Web-api项目,我在其中连接到Oracle数据库。对于连接,我使用块包oracleClientCore
我如何连接并调用存储过程:
string cs = "Data Source = 172.10.200.100:1521/dev;PERSIST SECURITY INFO=True;USER ID=test; Password=devtest;";
using (OracleConnection connection = new OracleConnection(cs)){
connection.Open();
using (OracleCommand cmd = connection.CreateCommand()) {
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_check_db";
cmd.ExecuteNonQuery();
connection.Close();
}
}
在存储过程sp_check_db
中,使insert into table
有时与数据库的连接断开,并且出现异常ORA-03114: not connected to ORACLE
。再次启用数据库后,我继续收到相同的错误ORA-03114: not connected to ORACLE
,直到重新生成并重新部署项目为止。
在这种情况下我该怎么办,这是不正确的行为? 我的代码或连接字符串出了什么问题?
答案 0 :(得分:2)
当您的应用程序依赖于外部集成(在这种情况下为数据库)时,由于补丁,网络故障等原因,该集成可能会在短时间内无法访问, 适合实施重试政策。如果发生特定的异常,重试逻辑将根据您的配置方式在一定时间内重新运行代码。
这里是一个示例,说明如何使用框架Polly实现简单的重试逻辑,如果包含ORA-03114
的异常发生,它将在十秒钟的时间内重新运行您的代码3次。如果代码在第三次之后仍引发相同的异常,则将引发该异常。
var retryTimes = 3;
var waitBetweenExceptions = TimeSpan.FromSeconds(10);
var retryPolicy = Policy
.Handle<OracleException>(e => e.Message.Contains("ORA-03114"))
.WaitAndRetry(retryTimes, i => waitBetweenExceptions);
await retryPolicy.Execute(() =>
{
string cs = "Data Source = 172.10.200.100:1521/dev;PERSIST SECURITY INFO=True;USER ID=test; Password=devtest;";
using (OracleConnection connection = new OracleConnection(cs)){
connection.Open();
using (OracleCommand cmd = connection.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_check_db";
cmd.ExecuteNonQuery();
connection.Close();
}
}
});