C # ORA-01012: не зарегистрирован - PullRequest
0 голосов
/ 25 декабря 2018

Я установил соединение с БД Oracle в моем проекте .net Core API

Я использую этот драйвер для подключения к 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

У меня естьуже прочитали вопрос , но есть пользователь, который решил проблему, установив для параметра «Подтверждение соединения» значение true, а также оставил предупреждение

В качестве предупреждения я цитирую документы Oracle.

Атрибут Validate Connection проверяет соединения, выходящие из пула.Этот атрибут следует использовать только в случае крайней необходимости, поскольку он заставляет сервер выполнять обход данных в базу данных для проверки каждого соединения непосредственно перед его предоставлением приложению.Если недопустимые соединения встречаются редко, разработчики могут создать собственный обработчик событий для получения нового соединения, а не использовать проверку соединения.Как правило, это обеспечивает лучшую производительность.

Я хочу знать, что делать после таких исключений перехвата и как выполнить автоматическое переподключение

try {
  cmd.ExecuteNonQuery();
} catch (OracleException oe) {
  Console.Out.WriteLine("OracleException: {0}", oe.Message);
  if (oe.Code == -1012) {
    // put your code here
  }
}

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я бы не стал повторять выполнение запроса после того, как было обнаружено исключение, это решение может сделать ваше приложение потенциально медленным и нестабильным.

Ваш код кажется достаточно простым, чтобы работать с использованием официального драйвера, поэтому зачем использоватькакой неофициальный драйвер вы используете?

Попробуйте использовать последнюю версию драйвера Oracle для ядра .NET:

Сначала удалите текущий драйвер, затем установите его с помощью NuGet или консоли NuGet:

Install-Package Oracle.ManagedDataAccess.Core -Version 2.18.3 
0 голосов
/ 01 февраля 2019

Чтобы ответить на ваш вопрос, вы можете попробовать что-то вроде следующего (простой пример):

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!
}

Это попытается, и если оно закрыто, откройте соединение и повторите попытку.Не уверен, что произойдет, если что-то еще закроет это соединение - вам нужно будет обработать это соответствующим образом вне цикла.

Однако это просто скрывает основную проблему.

...