我开发了一个OData服务,它从数据库中的一个表中获取50000条记录。我的目的是检查&比较OData服务与SOAP Web服务的响应时间。 SOAP中也开发了相同的服务。
在不使用.NET中的EntityFramework的情况下构建OData服务。
现在我的观察是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所声称的那样服务。还有如何使用Entity Framework做同样的事情。
答案 0 :(得分:2)
你自己造成这种情况。您每次都返回相同的DemoDataSources.Instance.EBAN。