如何构建OData服务;t将结果保存在变量中,以减少第二次获取的时间
本文关键字:变量 存在 时间 获取 第二次 保存 结果 构建 何构建 OData 服务 | 更新日期: 2023-09-27 18:00:12
我开发了一个OData服务,它从数据库中的一个表中获取50000条记录。我的目的是检查&将OData服务的响应时间与SOAP Web服务进行比较。SOAP中也开发了相同的服务。
OData服务是在不使用.NET.中的EntityFramework的情况下构建的
现在我的观察结果是,SOAP在所有请求中花费相同的时间。但是OData服务只在第一次调用时比SOAP花费更多的时间。后续呼叫相对较快。
当我调试代码时,我发现OData服务只是第一次访问数据库。随后的请求通过传递保存的变量中的数据来完成。由于我的表是一个事务表,因此值可能会快速更改,从而可能给出不正确的结果。
代码-:
实体类-:
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; }
}
}
数据获取-:
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服务所声称的响应时间。以及如何使用实体框架进行同样的操作。
这是你自己造成的。您每次都返回相同的DemoDataSources.Instance.EBAN。