如何构建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服务所声称的响应时间。以及如何使用实体框架进行同样的操作。

如何构建OData服务;t将结果保存在变量中,以减少第二次获取的时间

这是你自己造成的。您每次都返回相同的DemoDataSources.Instance.EBAN。