2016-08-03 13 views
0

JSON 결과를 아래 형식으로 반환하는 Oracle DB를 쿼리하기 위해 웹 API를 만들었습니다. API가 입력 매개 변수의 배열을 가져옵니다. 쿼리 결과가 아래의 쿼리와 같이 너무 커서 SQL Developer에서 시도 할 때 313568을 반환합니다. STPR_STUDY.STD_REF IN ("BL001, TM002")는 아래 'System.OutOfMemoryException'유형의 예외가 발생했습니다. WEB API

내가 URL https://bhbl.abc.org/api/Sample?id= 'BL001'& ID를 사용하고 때 우리가
public HttpResponseMessage Getdetails([FromUri] string[] id) 
{ 
    string connStr = ConfigurationManager.ConnectionStrings["ProDataConnection"].ConnectionString; 
    using (OracleConnection dbconn = new OracleConnection(connStr)) 
    { 
     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 + ")"; 
     using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn)) 
     { 
      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=ProvantisStudyData.json", out contentDisposition)) 
       { 
        response.Content.Headers.ContentDisposition = contentDisposition; 
       } 
       return response; 

를 사용하는 코드입니다 STCD_PRIO_CATEGORY에서

SELECT * enter image description here

로 DB를 쿼리하지만이 URL https://bhbl.abc.org/api/Sample?id= 'BL001'을 사용하고 경우에 = 'TM002' 그것은 J가 결과를 반환 ust 41552 records

방대한 양의 데이터를 반환하는 API를 만드는 방법. 모든 도움을 크게 주시면 환영합니다.

답변

2

API가 반환 한 데이터가 너무 커서 프로세스가 메모리 오버플로를 생성하기 때문입니다. 당신은 페이징 SQL을 사용해야합니다 :

SELECT * 
    FROM (SELECT a.*, ROWNUM rn 
      FROM (SELECT * 
        FROM table_name) a 
     WHERE ROWNUM <= 40) 
WHERE rn >= 21 

클라이언트 프로세스 한 번, 여러 호출 api, 모든 데이터 수집을 완료하십시오. 아래

클라이언트 핵심 코드 :

// ids: 'BL001' 'TM002', next_key: paging record index 
while (next_key != null) 
{ 
    next_key = GetDetails(ids, next_key); 
} 

private string GetDetails(stirng[] ids, string next_key) 
{ 
    // call api 
    var result = ...; 

    // parse api reponse result 
    object key = result.next_key; 
    if (key == null) return null; 
    string s = key.ToString(); 
    return string.IsNullOrEmpty(s) ? null : s; 
} 

아래의 서버 핵심 코드 : 페이징없이

public HttpResponseMessage Getdetails([FromUri] string[] id, [FromUri] string next_key) 
{ 
    // use paging sql 
    // excute sql return record count 
    var count = ... 

    // return next_key 
    if (count < 20) 
    { 
     result.next_key = null; 
    } 
    else 
    { 
     result.next_key = (int.Parse(next_key) + 20).ToString(); 
    } 

    return result; 
} 
+0

우리는이 작업을 수행 할 수 있습니까? 클라이언트가 즉시 결과를 찾고 있기 때문에 – trx

+0

@trx 클라이언트 프로세스가 한 번, 여러 번 호출 api, 모든 데이터 수집을 완료하십시오. –

관련 문제