我不确定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左右。
答案 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
*我主要从参考资料中不公开可见的部分得出结论。