0
كما هو معروف يتم الربط بين البرنامج وقاعدة البيانات عن طريق تعليمات الـ SQL, والتي يتم تفسيرها من قبل مخدم قواعد البيانات وإعادة الناتج, وهذا ما يتسبب بتأخر في الاستجابة, وخاصة في حالة قواعد البيانات الكبيرة, والأهم من هذا كله حالة حدوث ضغط على تطبيق الويب ومخدم قواعد البيانات نتيجة الزيادة في عدد المستخدمين المتصفحين للموقع, مما يتسبب بتأخير في الاستجابة لطلبات الصفحات والذي قد يتسبب بدوره بانهيار قاعدة البيانات, وهنا جاء دور تقنية الـ Cache والتي لها عمل مشابهة لذاكرة الكاش في المعالج Cache Memory, حيث تقدم ASP.Net للمطور الكائن Cache وهو عبارة عن ذاكرة تخزين للبيانات المؤقتة المستخدمة في التطبيق, حيث تكون هذه البيانات متاحة لجميع مستخدمي التطبيق, فيتم على سبيل المثال في حالة جلب البيانات من قاعدة البيانات, بالتأكد أولا من وجودها في حالة الكاش Cache State المخزنة في الذاكرة, فإذا كانت هذه البيانات موجودة فيها تم جلبها من الذاكرة وإلا فإنه يتم جلبها من قاعدة البيانات وتخزينها في الذاكرة وإعطاءها مدة صلاحية, حيث أنه بعد انتهاء هذه المدة يتم حذف هذه البيانات بشكل تلقائي, هذا ويوجد عدة طرق لحذف هذه البيانات, فيمكن حذفها برمجيا عن طريق نداء الدالة Remove أو ديناميكيا (تلقائيا) عند حدوث ضغط على موارد المخدم, إضافة إلى طريقة تحديد زمن الصلاحية (زمن الحياة) سابق الذكر, ومن الجدير بالذكر أنه في حالة الحذف الديناميكي (التلقائي) يتم حذف البيانات من حالة الكاش Cache State بنفس الترتيب الذي تم تخزينها فيها.
ولإضافة بيانات إلى ذاكرة الكاش الخاصة بـ ASP.Net أو تعديل بيانات موجودة مسبقا يتم ذلك عن طريق الكائن Cache كما يلي:
Cache["VariableName"] = VariableValue;
حيث:
VariableName: اسم المتحول.
VariableValue: القيمة المراد إسنادها إلى المتحول.
وفي هذه الحالة (حالة استخدامنا لمعامل المصفوفة [] في التخزين) ستخزن عندها البيانات دون أي محددات, وبذلك لن تحذف هذه البيانات إلا في حالة حدوث ضغط على مصادر المخدم, في حين يمكن وضع مقيدات خاصة تحدد الكيفية التي يتم بها حذف هذه البيانات, وفي هذه الحالة يجب استخدام إحدى الطريقتين Add أو Insert, والفرق بين الطريقة Add والطريقة Insert هو أن Add تعيد مرجعا إلى الكائن المخزن مؤقتا, في حين لا تعيد الدالة insert أي شيء.
أما بالنسبة لعملية الحذف البرمجي سابقة الذكر فتتم عن طريق نداء الدالة Remove من الكائن Cache, كما يلي:
Cache.Remove("VariableName");
وفي هذه الحالة (حالة استخدامنا لمعامل المصفوفة [] في التخزين) ستخزن عندها البيانات دون أي محددات, وبذلك لن تحذف هذه البيانات إلا في حالة حدوث ضغط على مصادر المخدم, في حين يمكن وضع مقيدات خاصة تحدد الكيفية التي يتم بها حذف هذه البيانات, وفي هذه الحالة يجب استخدام إحدى الطريقتين Add أو Insert, والفرق بين الطريقة Add والطريقة Insert هو أن Add تعيد مرجعا إلى الكائن المخزن مؤقتا, في حين لا تعيد الدالة insert أي شيء.
أمثلة برمجية:
1- تخزين ملف XML في الكائن Cache بدلا من قراءته كل مرة:
Cache.Insert("key", myXMLFileData, new System.Web.Caching.CacheDependency(Server.MapPath(”users.xml”)));
في هذا المثال سيتم إدخال بيانات بصيغة XML من ملف XML إلى الكائن Cache, وبذلك لن تكون هناك حاجة لقراءة الملف كل مرة في الطلبات المتتابعة لهذه البيانات, وكما نلاحظ فقد تم تعيين ارتباطيه Dependency هذه البيانات بالملف users.xml, بذلك فإن أي تغييرات في هذا الملف سيتم اكتشافها فورا وإنهاء حياة البيانات الحالية الموجودة في الكائن Cache, لتسمح للبيانات الجديدة في الملف بأن تنسخ إلى الكائن Cache.
2- مثال على اعتمادية البيانات في حالة الكاش:
Cache.Insert("dependentkey", myDependentData, new System.Web.Caching.CacheDependency(new string[] {}, new string[] {"otherkey"}));
يقوم هذا المثال بإدخال بيانات تعتمد على وجود بيانات أخرى في الكائن Cache (هذه البيانات موجودة في معرفة بالمفتاح otherkey), فإذا لم يتم العثور على البيانات المعرفة بالمفتاح otherkey أو في حال تغيرها أو انتهاء حياتها, فسيتم عندها إنهاء حياة البيانات المعرفة في المفتاح المعتد عليها dependentkey.
3- مثال يبين كيفية تحديد زمن حياة البيانات:
Cache.Insert("key", myTimeSensitiveData, null, DateTime.Now.AddMinutes(1), TimeSpan.Zero);
وفي هذا المثال سنقوم بتخزين بيانات وتحديد زمن انتهاء حياتها, حيث تم تحديد زمن انتهاءها على أنه دقيقة بعد لحظة تخزين البيانات, وقد تم تحديد الوسيط الثالث بالتعبير TimeSpan.Zero, حيث أنه لا يمكن استخدام الوسيطين معا.
إعداد: وسام مويّس
مراجع: كتاب أنشئ مواقع الويب باستخدام ASP.Net و C#, منشورات دار شعاع



