C # .net Core переподключиться к Oracle после включения базы данных - PullRequest
0 голосов
/ 02 июля 2018

Проблема в том, как переподключиться к базе данных Oracle после проблем

У меня есть проект .net Core web-api в докере, где я подключаюсь к базе данных Oracle. Для подключения я использую пакет nugget 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 голосов
/ 02 июля 2018

Когда ваше приложение зависит от внешних интеграций (в данном случае от вашей базы данных), которые могут быть недоступны в течение небольших периодов времени из-за исправлений, сбоя сети и т. Д., Его подходит для реализации политики повторных попыток. Логика повторных попыток будет зависеть от того, как вы ее настроите, повторно выполнить код через определенное время, если произойдет конкретное исключение.

Вот пример того, как реализовать простую логику повторных попыток с помощью инфраструктуры Polly , которая будет перезапускать ваш код три раза в течение десятисекундного промежутка, если возникнет исключение, содержащее ORA-03114. Если код все еще выдает то же самое исключение после третьего раза, исключение пойдет, бросьте.

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