ما هي أفضل طريقة لتحميل البيانات المعاد استخدامها بشكل كبير في تطبيق ويب .net

StackOverflow https://stackoverflow.com/questions/64284

  •  09-06-2019
  •  | 
  •  

سؤال

لنفترض أن لدي قائمة بالفئات للتنقل في تطبيق ويب.بدلاً من الاختيار من قاعدة البيانات لكل مستخدم، هل يجب علي إضافة استدعاء دالة في application_onStart الخاص بـ global.asax لجلب تلك البيانات إلى مصفوفة أو مجموعة يتم إعادة استخدامها مرارًا وتكرارًا.إذا لم تتغير بياناتي على الإطلاق - (تحرير - في كثير من الأحيان)، فهل ستكون هذه هي الطريقة الأفضل؟

هل كانت مفيدة؟

المحلول

يمكنك تخزين عناصر القائمة في كائن التطبيق.أنت على حق بشأن application_onStart(), ما عليك سوى استدعاء الطريقة التي ستقرأ قاعدة البيانات الخاصة بك وتحميل البيانات إلى كائن التطبيق.

في Global.asax

public class Global : System.Web.HttpApplication
{
    // The key to use in the rest of the web site to retrieve the list
    public const string ListItemKey = "MyListItemKey";
    // a class to hold your actual values. This can be use with databinding
    public class NameValuePair
    { 
        public string Name{get;set;} 
        public string Value{get;set;}
        public NameValuePair(string Name, string Value)
        {
            this.Name = Name;
            this.Value = Value;
        }
    }

    protected void Application_Start(object sender, EventArgs e)
    {
        InitializeApplicationVariables();
    }


    protected void InitializeApplicationVariables()
    {
        List<NameValuePair> listItems = new List<NameValuePair>();
        // replace the following code with your data access code and fill in the collection
        listItems.Add( new NameValuePair("Item1", "1"));
        listItems.Add( new NameValuePair("Item2", "2"));
        listItems.Add( new NameValuePair("Item3", "3"));
        // load it in the application object
        Application[ListItemKey] = listItems;
    }
 }

يمكنك الآن الوصول إلى قائمتك في بقية المشروع.على سبيل المثال، في default.aspx لتحميل القيم في DropDownList:

<asp:DropDownList runat="server" ID="ddList" DataTextField="Name" DataValueField="Value"></asp:DropDownList>

وفي ملف الكود الخلفي:

protected override void OnPreInit(EventArgs e)
{
    ddList.DataSource = Application[Global.ListItemKey];
    ddList.DataBind();
    base.OnPreInit(e);
}

نصائح أخرى

إذا لم يتغير أبدًا، فمن المحتمل أنه لا يلزم أن يكون موجودًا في قاعدة البيانات.

إذا لم يكن هناك الكثير من البيانات، فيمكنك وضعها في web.config، أو في شكل enum في التعليمات البرمجية الخاصة بك.

جلب كل شيء قد يكون مكلفا.حاول استخدام init البطيء، واجلب بيانات الطلب فقط ثم قم بتخزينها في متغير ذاكرة التخزين المؤقت.

التحسين المبكر هو الشر.نظرًا لذلك، إذا كنت تواجه مشكلات في الأداء في تطبيقك ولديك معلومات "ثابتة" تريد عرضها لمستخدميك، فيمكنك بالتأكيد تحميل تلك البيانات مرة واحدة في مصفوفة وتخزينها في كائن التطبيق.تريد توخي الحذر وموازنة استخدام الذاكرة مع التحسين.

المشكلة التي تواجهها بعد ذلك هي تغيير معلومات قاعدة البيانات المخزنة وعدم تحديث النسخة المخزنة مؤقتًا.ربما ترغب في الحصول على نوع من تاريخ آخر تغيير في قاعدة البيانات التي تخزنها في الحالة مع البيانات المخزنة مؤقتًا.وبهذه الطريقة يمكنك الاستعلام عن أكبر وقت تغير ومقارنته.إذا كان أحدث من التاريخ المخزن مؤقتًا، فيمكنك تفريغه وإعادة تحميله.

في متغير التطبيق.

تذكر أن متغير التطبيق يمكن أن يحتوي على كائن في .Net، بحيث يمكنك إنشاء مثيل للكائن في global.asax ثم استخدامه مباشرة في التعليمات البرمجية.

نظرًا لأن متغيرات التطبيق موجودة في الذاكرة، فهي سريعة جدًا (مقابل الاضطرار إلى استدعاء قاعدة بيانات)

على سبيل المثال:

// Create and load the profile object
x_siteprofile thisprofile = new x_siteprofile(Server.MapPath(String.Concat(config.Path, "templates/")));
Application.Add("SiteProfileX", thisprofile);

أود تخزين البيانات في ذاكرة التخزين المؤقت للتطبيق (كائن ذاكرة التخزين المؤقت).ولن أقوم بتحميله مسبقًا، بل سأقوم بتحميله عند طلبه لأول مرة.ما هو جميل في ذاكرة التخزين المؤقت هو أن ASP.NET سيديرها بما في ذلك إعطائك خيارات لانتهاء صلاحية إدخال ذاكرة التخزين المؤقت بعد تغيير الملف، أو فترة زمنية، وما إلى ذلك.وبما أن العناصر محفوظة في الذاكرة، لا يتم إجراء تسلسل/إلغاء تسلسل للكائنات، لذا يكون الاستخدام سريعًا جدًا.

الاستخدام واضح ومباشر.توجد أساليب Get وAdd على كائن ذاكرة التخزين المؤقت لاسترداد العناصر وإضافتها إلى ذاكرة التخزين المؤقت على التوالي.

أستخدم مجموعة ثابتة كمجموعة خاصة مع خاصية ثابتة عامة تقوم بتحميلها أو الحصول عليها من قاعدة البيانات.

بالإضافة إلى ذلك، يمكنك إضافة وقت وتاريخ ثابت يتم تعيينه عند تحميله، وإذا قمت باستدعاءه، بعد مرور فترة زمنية معينة، قم بمسح المجموعة الثابتة وإعادة الاستعلام عنها.

التخزين المؤقت هو الطريق للذهاب.وإذا كنت من محبي أنماط التصميم، فقم بإلقاء نظرة على المفردة.

بشكل عام، لست متأكدًا من أنني سأشعر بالقلق حيال ذلك حتى تلاحظ تدهور الأداء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top