偶尔出现的ORA-12537:网络会话:与外部源通信时文件结束

时间:2019-06-11 20:05:28

标签: c# oracle entity-framework

我不确定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 个答案:

答案 0 :(得分:1)

有时,该错误可能是由于SQL中的“ IN”列表过大而引起的。例如:

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

*我主要从参考资料中不公开可见的部分得出结论。