内存不足异常或Oracle Unexcepted数据包读取错误

时间:2016-07-28 15:59:28

标签: c# asp.net asp.net-mvc oracle asp.net-web-api

我正在创建一个asp.net Web API服务端点,它从oracle数据库返回批量数据。我正在转换JSON格式的返回数据。它工作正常,但突然我收到一个错误,说字符串结果中的Out of Memory异常或它显示网络会话:意外的数据包读取错误

public HttpResponseMessage Getdetails([FromUri] string[] id)
{
    using (OracleConnection dbconn = new OracleConnection("DATA SOURCE=J;PASSWORD=C;PERSIST SECURITY INFO=True;USER ID=T"))
    {
        var inconditions = id.Distinct().ToArray();
        var srtcon = string.Join(",", inconditions);
        DataSet userDataset = new DataSet();
        var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN(" + srtcon + ")";
        OracleCommand selectCommand = new OracleCommand(strQuery, dbconn);
        OracleDataAdapter adapter = new OracleDataAdapter(selectCommand);
        DataTable selectResults = new DataTable();
        adapter.Fill(selectResults);
        string result = JsonConvert.SerializeObject(selectResults);
        string contentDisposition = "inline; filename=ProvantisStudyData.json";
        //byte[] byteInfo = Encoding.ASCII.GetBytes(result);
        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, result, MediaTypeHeaderValue.Parse("application/json"));
        response.Content.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse(contentDisposition);
        //response.Content.Headers.ContentLength = byteInfo.Length;
        return response;
  }
}

enter image description here

但是当我直接在Oracle DB中执行相同的查询时,它会返回数据。它返回超过50,000条记录。错误是不一致的,有时会返回结果,有时它会返回内存不足异常或Oracle Unexcepted数据包读取错误,使用相同的过滤器。

1 个答案:

答案 0 :(得分:1)

通过网络以JSON格式发送的50,000条记录可能是12兆字节(疯狂猜测 - 可能偏低)或更多数据;并且使用以太网,您的数据包大小约为1千字节,因此您的响应将以12 MB / 1 KB的速度传输到每个数据包≈12,000个数据包。

要验证数据的大小以及导致错误的原因,一个好的方法是使用Wireshark捕获您收到错误的计算机上的网络流量。它将标记丢失的网络数据包,显示数据包的大小等。您可以在服务器上调用查询而不会出现任何问题指向网络中的某些内容。

另一个要查看的地方是服务器上的TNS监听器日志文件;检查错误会很快。命令lsnrctl status将说明日志文件的位置:

$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 28-JUL-2016 19:01:11
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=example.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                27-JUL-2016 14:33:08

...

Listener Parameter File   /u01/app/oracle/product/12.1.0.2/db_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/plsekatlasexta01/listener/alert/log.xml
Listening Endpoints Summary...

现在,解决方案:

  • 您是否能够将输出分解为客户端可以在单独请求中请求的块?
  • 当只需要一些列时,您是否选择了所有列?