.NET CORE 2.1 - БД Oracle превысило максимальное время соединения (ORA-02399), хотя я вызвал Dispose () - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть метод, написанный на C #, который подключается к Oracle db, выполняет работу и затем вызывает Dispose () в части finally.Однако я получил эту ошибку:
ORA-02399 : превышено максимальное время подключения, вы выходите из системы. Когда я обновляюсь, я получил еще одну ошибку: ORA-01012 : нетвошел в систему Третье обновление загружает данные.

Проект: библиотека классов .NET Core 2.1
NugetPackage: Oracle.ManagedDataAccess.Core (2.18.3)
Вот мой код

public object GetAllDataByDate(string user, DateTime from,DateTime to, int count=10)
    {

        if (con.State != ConnectionState.Open)
            con.Open();
        try
        {
           return ExtractData(user, from,to, count);

        }
        catch (Exception ex)
        {
            return new
            {
                Error = "Error occured during the extraction of data",
                ex.GetType().FullName,
                ex.Message,
                ex.InnerException
            };
        }
        finally
        {
            con.Dispose();
        }

    }

DoМне нужно также вызвать con.Close ()?или я что-то пропустил в своем коде?Спасибо

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Наконец я решил это.Это не было связано с кодом, но сама строка подключения.Oracle по умолчанию включает пул в .NET, что приводит к проблеме тайм-аута.для получения более подробной информации, документация .
Мне просто нужно было добавить Pooling=False; к моей строке подключения.

Тем временем я изменил con.Dispose(); на con.Close();, потому что он не прошел в UnitTest, когда я дважды вызывал в том же TestMethod (хотя он работал во время отладки)

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

0 голосов
/ 04 декабря 2018

Ваш блок try catch включает инструкцию return, которая обойдет блок finally.Рефакторинг, чтобы попробовать и использовать: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

using(var con = new DisposableObject()){}

Pattern, и не возвращаться внутрь блока try catch catch finally.Все, что реализует IDisposable, может использоваться с using block (рекомендуется в 99% случаев, но всегда есть несколько исключений, подтверждающих правило.

Краткий пример поведения, которое вы выполняете в блоке try catch:

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Test());
    }
    public static string Test() 
    {
        var response = "Hi";
        try
        {
            response = "bye";
            return response;
        }catch(Exception ex){
            response = "fail";
        }finally{
            response = "finally";
        }
        return response;
    }
}

Результат будет "пока", а не "наконец"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...