Ich habe einen OData-Service entwickelt, der 50000 Datensätze aus einer Tabelle in der Datenbank abruft. Mein Zweck ist überprüfen & Vergleichen Sie die Antwortzeit eines OData-Service mit SOAP Webservice. Derselbe Dienst wurde auch in SOAP entwickelt.Wie wird der OData-Service aufgebaut, der das Ergebnis nicht in Variablen speichert, um die Abrufzeit vom zweiten Mal zu reduzieren?
OData-Dienst wird ohne Verwendung von EntityFramework in .NET erstellt.
Jetzt meine Beobachtung ist, dass SOAP in allen Anfragen die gleiche Zeit dauert. Aber der OData-Dienst benötigt nur während des ersten Anrufs mehr Zeit als SOAP. Nachfolgende Aufrufe sind vergleichsweise schneller.
Als ich den Code debuggte, stellte ich fest, dass OData-Dienst die Datenbank zum ersten Mal trifft. Nachfolgende Anforderungen werden erfüllt, indem Daten von diesen gespeicherten Variablen übergeben werden. Da meine Tabelle eine Transaktionstabelle ist, können sich die Werte schnell ändern, was möglicherweise zu falschen Ergebnissen führt.
-Code -:
Entity-Klasse -:
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; }
}
}
Daten 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();
}
}
}
}
Controller-Klasse -:
[EnableQuery]
public class EBANController : ApiController
{
public IHttpActionResult Get()
{
return Ok(DemoDataSources.Instance.EBAN.AsQueryable());
}
}
Wie kann ich die Datenbank schlug immer eher als in Variablen zu speichern (wie es der Fall in SOAP-Service) zur Verfügung und verringert auch die Reaktionszeit wie durch einen OData-Dienst in Anspruch genommen wird. Auch, wie man dasselbe mit Entity Framework macht.
Können Sie den genauen Fehler im Code angeben? Und wie ändere ich den Code, um weniger Zeit als SOAP-Service zu nehmen. Ich kann den Unterschied in der Dateigröße sehen (weil JSON-Datei immer kleiner als XML-Datei ist) –