启用数据库后,C#.net Core重新连接到Oracle

时间:2018-07-02 09:56:54

标签: c# oracle .net-core asp.net-core-webapi

问题是遇到麻烦后如何重新连接到数据库Oracle

我在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,直到重新生成并重新部署项目为止。

在这种情况下我该怎么办,这是不正确的行为? 我的代码或连接字符串出了什么问题?

1 个答案:

答案 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();
      }
    }
});