Иногда ORA-12537: Сетевой сеанс: конец файла при обмене данными с внешним источником - PullRequest
0 голосов
/ 11 июня 2019

Я не уверен, External Source - правильная формулировка, но по сути у меня есть представление в моей базе данных, которое указывает на таблицу в другой базе данных. Не всегда, но время от времени я получаю исключение ORA-12537 Network Session: End of File. Я использую Entity Framework, поэтому я попытался разбить его, чтобы вместо одного массивного запроса он выполнял несколько запросов для генерации окончательного результата. Но это оказало неоднозначное влияние.

    public List<SomeDataModel> GetDataFromList(List<string> SOME_LIST_OF_STRINGS)
    {
        var retData = new List<SomeDataModel>();
        const int MAX_CHUNK_SIZE = 1000;
        var totalPages = (int)Math.Ceiling((decimal)SOME_LIST_OF_STRINGS.Count / MAX_CHUNK_SIZE);
        var pageList = new List<List<string>>();

        for(var i = 0; i < totalPages; i++)
        {
            var chunkItems = SOME_LIST_OF_STRINGS.Skip(i * MAX_CHUNK_SIZE).Take(MAX_CHUNK_SIZE).ToList();
            pageList.Add(chunkItems);
        }


        using (var context = new SOMEContext())
        {
            foreach(var pageChunk in pageList)
            {
                var result = (from r in context.SomeEntity
                              where SOME_LIST_OF_STRINGS.Contains(r.SomeString)
                              select r).ToList();

                result.ForEach(x => retData.Add(mapper.Map<SomeDataModel>(x)));
            }

        }
        return retData;
    }

Я не уверен, есть ли другой подход к решению этого исключения или нет, или если разбиение запроса имеет какой-либо желаемый эффект. Вероятно, стоит отметить, что SOME_LIST_OF_STRINGS довольно большой (в среднем около 21 000), поэтому totalPages обычно занимает около 22.

1 Ответ

1 голос
/ 12 июня 2019

Иногда эта ошибка может быть вызвана чрезмерно большим списком «IN» в SQL. Например:

SELECT *
  FROM tbl
  WHERE somecol IN ( ...huge list of stuff... );

Включение трассировки на уровне приложения или базы данных может помочь определить, имеет ли SQL, который создается за кулисами, большой список IN.

Обходным путем может быть ВСТАВИТЬ «... огромный список вещей ...» в таблицу, а затем использовать что-то похожее на запрос ниже, чтобы избежать огромного списка литералов.

SELECT *
  FROM tbl
  WHERE somecol IN ( select stuff from sometable );

Ссылка *: https://support.oracle.com/knowledge/More%20Applications%20and%20Technologies/2226769_1.html

* Я в основном сделал свои выводы из той части ссылки, которая не является общедоступной.

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