2016-08-09 50 views
0

我們創建了用於查詢Oracle數據庫的WebAPI,並以JSON格式返回它們。我的代碼如下通過Web API返回大量數據集的問題

public class PDataController : ApiController 
{ 
public HttpResponseMessage Getdetails([FromUri] string[] id) 
{ 
    List<OracleParameter> prms = new List<OracleParameter>(); 
    string connStr = ConfigurationManager.ConnectionStrings["PDataConnection"].ConnectionString; 
    using (OracleConnection dbconn = new OracleConnection(connStr)) 
    { 
     DataSet userDataset = new DataSet(); 
     var strQuery = @"SELECT * from STCD_PRIO_CATEGORY where STPR_STUDY.STD_REF IN("; 
     StringBuilder sb = new StringBuilder(strQuery); 
     for(int x = 0; x < inconditions.Length; x++) 
      { 
       sb.Append(":p" + x + ","); 
       OracleParameter p = new OracleParameter(":p" + x, OracleType.Int32); 
       p.Value = inconditions[x]; 
       prms.Add(p); 
      } 
     if(sb.Length > 0) sb.Length--; 
     strQuery = strQuery + sb.ToString() + ")"; 
     using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) 
      { 
      selectCommand.Parameters.AddRange(prms.ToArray()); 
      using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) 
      { 
       DataTable selectResults = new DataTable(); 
       adapter.Fill(selectResults); 
       var returnObject = new { data = selectResults }; 
       var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json")); 
       ContentDispositionHeaderValue contentDisposition = null; 
       if (ContentDispositionHeaderValue.TryParse("inline; filename=PStudyData.json", out contentDisposition)) 
       { 
        response.Content.Headers.ContentDisposition = contentDisposition; 
       } 
       return response; 
      } 
     } 

    } 
} 

查詢返回巨大的結果,所以它有時會拋出OutOfMemoryException異常。 enter image description here 而不是在每個頁面請求期間調用API。在每個初始頁面請求上調用API,將數據庫響應緩存在中間層上,然後從該「本地」緩存分頁。可以採用上述方法。我有點在內存問題上停滯不前,無法繼續前進。由於我對ASP.NET和C#編碼非常陌生,任何幫助都非常感謝。謝謝

+0

像羅曼說的那樣,讓api獲取一個頁碼和一個頁面大小並返回這些特定的記錄。添加一個檢查來確保頁面大小是有限的(例如不超過100條記錄)。 – Igor

回答

4

我會推薦實現分頁和返回數據塊。我認爲可以肯定地說,如果服務器上的內存不足,那麼接收端的帶寬和內存問題也可能會出現問題。

相關問題