Я разработал службу OData, которая извлекает 50000 записей из одной таблицы, присутствующей в базе данных. Моя цель - check & сравнить время отклика службы OData с помощью SOAP webservice. Такая же служба была разработана и в SOAP.Как создать службу OData, которая не сохраняет результат в переменных, чтобы уменьшить время выборки во второй раз?
Служба OData построена без использования EntityFramework в .NET.
Теперь мое наблюдение заключается в том, что SOAP принимает одинаковое время во всех запросах. Но служба OData занимает больше времени, чем SOAP только во время первого вызова. Последующие звонки сравнительно быстрее.
Когда я отлаживал код, я обнаружил, что служба OData попадает в базу данных только в первый раз. Последующие запросы выполняются путем передачи данных из этих сохраненных переменных. Поскольку моя таблица является таблицей транзакций, значения могут быстро меняться, что дает, возможно, неверные результаты.
Код -:
Entity класс -:
namespace Demo.Models
{
public class EBAN
{
[Key]
public String MANDT { get; set; }
[Key]
public String BANFN { get; set; }
[Key]
public String BNFPO { get; set; }
public String BSART { get; set; }
public String BSTYP { get; set; }
public String BSAKZ { get; set; }
public String LOEKZ { get; set; }
}
}
данных Fetching -:
using Demo.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OracleClient;
namespace Demo.DataSource
{
public class DemoDataSources
{
private static DemoDataSources instance = null;
public int noOfRecords { get; set; }
public static DemoDataSources Instance
{
get
{
if (instance == null)
{
instance = new DemoDataSources();
}
return instance;
}
}
public List<EBAN> EBAN { get; set; }
private DemoDataSources()
{
this.Reset();
this.Initialize();
}
public void Reset()
{
this.EBAN = new List<EBAN>();
}
public void Initialize()
{
DataTable dt = new DataTable();
OracleCommand cmd = new OracleCommand();
cmd.CommandText = " Select MANDT, BANFN, BNFPO, BSART, bstyp , BSAKZ, LOEKZ from ctdrdb.t_eban_mm WHERE rownum < = 5";
dt = getDataTableWithParams(cmd);
List<EBAN> l = new List<EBAN>();
EBAN e;
for (int i = 0; i < dt.Rows.Count; i++)
{
e = new EBAN()
{
MANDT = dt.Rows[i]["MANDT"].ToString(),
BANFN = dt.Rows[i]["BANFN"].ToString(),
BNFPO = dt.Rows[i]["BNFPO"].ToString(),
BSART = dt.Rows[i]["BSART"].ToString(),
BSTYP = dt.Rows[i]["bstyp"].ToString(),
BSAKZ = dt.Rows[i]["BSAKZ"].ToString(),
LOEKZ = dt.Rows[i]["LOEKZ"].ToString(),
};
l.Add(e);
}
this.EBAN.AddRange(l);
}
public DataTable getDataTableWithParams(OracleCommand Orcmd)
{
OracleConnection conn = new OracleConnection(ConnGetSmsDetail);
try
{
DataTable dt = new DataTable();
OracleDataAdapter da;
//OPENING THE CONNECTION
if (conn.State == ConnectionState.Closed)
{ conn.Open(); }
Orcmd.Connection = conn;
da = new OracleDataAdapter(Orcmd);
da.Fill(dt);
da.Dispose();
//CLOSING THE CONNECTION
conn.Close();
return dt;
}
finally
{
conn.Close();
}
}
}
}
контроллер класса -:
[EnableQuery]
public class EBANController : ApiController
{
public IHttpActionResult Get()
{
return Ok(DemoDataSources.Instance.EBAN.AsQueryable());
}
}
Как я попал в базу данных всегда, а не хранить в переменных (как это имеет место в службе SOAP), а также уменьшить время отклика как утверждают службы OData. Также как сделать то же самое с помощью Entity Framework.
Можете ли вы указать точную ошибку в коде? А также, как изменить код на меньшее время, чем SOAP-сервис. Я вижу разницу в размере файла (это связано с тем, что файл JSON всегда будет меньшего размера, чем файл XML) –