واحد. مفهوم
في بيئة الشبكة ، يكون تطبيق قاعدة البيانات عبارة عن نمط بنية C/S أو متعدد الطبقات. في هذه البيئة ، يجب أن يفكر تطوير تطبيقات قاعدة البيانات في تقليل مقدار نقل بيانات الشبكة قدر الإمكان وتحسين التزامن قدر الإمكان. بناءً على هذا الغرض ، ظهرت تقنية تحديث البيانات المخزنة مؤقتًا يتم الانتهاء من العملية ، يتم إرسال البيانات إلى قاعدة البيانات في وقت واحد في وقت مناسب ، مما يقلل بشكل كبير من حركة الشبكة ، ويقلل من الحمل على خادم قاعدة البيانات ، ويحسن أداء التزامن.
يجب أن يقال أن هذه ليست تقنية جديدة للغاية. ومع ذلك ، وجد المؤلف أن بعض المبرمجين لا يهتمون بالاستخدام العقلاني لهذه التكنولوجيا ولا يزالون يبقون تحت فكرة التطبيقات المستقلة ، مما يؤدي إلى عدم الكفاءة أو الأخطاء المحتملة في البرامج المترجمة. لذلك ، من الضروري تلخيص مزايا ومبادئ وطرق تطبيق هذه التكنولوجيا (أخذ دلفي كمثال).
اثنين. إيجابيات وسلبيات
تقنية تحديث البيانات مع ذاكرة التخزين المؤقت لها المزايا التالية:
(1) تقليل حركة مرور الشبكة وتقليل وقت الوصول إلى البيانات. تحسين كفاءة مشغلي قاعدة بيانات العميل.
(2) يقلل من العبء على خادم قاعدة البيانات ، لأنه يمكن إكمال العديد من التحديثات والتعديلات المتكررة وعمليات الحذف في المخزن المؤقت للعميل ، ويتم تقديم النتائج فقط إلى الخادم في النهاية.
(3) تقليل وقت معالجة المعاملات بفعالية وتقليل إنتاجية المعاملات المتزامنة. هذا يمكن أن يضمن بشكل أفضل اتساق قاعدة البيانات.
يمكننا تقديم مثال لتوضيح تفوقه: يقوم مشغل قاعدة البيانات بإدراج سجل بيانات في قاعدة البيانات ، ولكن يجد على الفور أن السجل لا يفي بالمتطلبات ، لذلك يحذف البيانات. في هذه العملية ، إذا تم استخدام تقنية تحديث البيانات بدون عازلة ، فسيقوم جانب الخادم بإجراء عملية إدخال واحدة وعملية حذف واحدة ، وإجراء عمليات نقل بيانات ذهابًا وإيابًا على جانب العميل والخادم ، وإذا تم استخدام هذه البيانات مع جداول قاعدة البيانات الأخرى. إذا تم اعتماد طريقة تحديث البيانات باستخدام ذاكرة التخزين المؤقت ، فيمكن إكمال هذه الخطوتين من العمليات العكسية في المخزن المؤقت للبيانات للعميل دون أي إجراءات إلى جانب الخادم ، ولن يتم إنشاء تحديث بيانات الشبكة وتحديث البيانات. هذا يوضح المزايا الضخمة لتكنولوجيا تحديث البيانات المخزنة.
أحد العيوب في تحديث البيانات مع ذاكرة التخزين المؤقت هو أنه نظرًا لأن البيانات يتم تخزينها على العميل ، إذا تم تغيير البيانات من قبل المستخدمين الآخرين ، فسيؤدي ذلك إلى مواقف غير متسقة مثل الخسارة والتعديل. النظر تماما في المتغيرات. يتطلب تطبيق هذه التكنولوجيا مهارات معينة وتغييرات في التفكير.
ثلاثة. مبادئ التطبيق
تنعكس مزايا أي تقنية في بيئة معينة.
(1) C/S أو مناسبات تطبيق قاعدة البيانات متعددة الطبقات. في هذه الحالة ، يمكن تقليل حركة مرور الشبكة بشكل فعال. في الوضع المستقل ، لا معنى لها التكنولوجيا.
(2) في حالة تحديث البيانات لجداول متعددة. على سبيل المثال ، في تحديث بنية الجدول/التفاصيل الرئيسية ، غالبًا ما تؤثر إضافة وحذف الجدولين على بعضها البعض. هذا يقصر بشكل فعال وقت المعاملة ويضمن أفضل اتساق البيانات.
(3) في المرافق التي تكون فيها سعة تحميل الخادم محدودة. في الوقت الحاضر ، مع زيادة سرعة أجهزة الكمبيوتر والانخفاض في السعر ، يصبح الفرق في إمكانات العملاء والخوادم أصغر وأصغر ، وتقليل قدرات الخدمة للخوادم نسبيًا. بموضوعية ، يجب تقليل العبء على الخادم من منظور البرنامج ، بينما تقلل تحديثات البيانات المخزنة من العبء على الخادم من خلال مشاركة جزء من مهمة التحديث من قبل العميل.
(4) في الحالة التي يكون فيها احتمال تحديث البيانات في نفس الوقت منخفضًا نسبيًا. إذا كان من المحتمل أن يتم تحديث البيانات نفسها في قاعدة البيانات من قبل مستخدمين متعددين في نفس الفترة ، فإن هذا الموقف غير مناسب للتحديثات المخزنة مؤقتًا ، لأنه في هذه الحالة ، يتم إنشاء الخطأ في الكتابة فوق البيانات بسهولة ، مما يؤدي إلى عدم تناقض البيانات.
أربعة. نظرة عامة على طرق التحكم في دلفي
كأداة لتطوير قاعدة البيانات الشائعة ، لدى Delphi وظائف معالجة قاعدة البيانات الغنية. يوفر Delphi دعمًا شاملاً لتكنولوجيا الوصول إلى البيانات المخزنة. بشكل عام ، توفر Delphi للمستخدمين عدة عناصر تحكم في مجموعة البيانات للوصول إلى جداول قاعدة البيانات مثل TTable و Tquery ؛ هناك خيار CacheDupdate في التحكم في مجموعة البيانات. ، فقط عندما يتم استدعاء الطريقة الفعلية المقدمة (مثل ApplicuPdates () ، إلخ) ، تعكس Delphi البيانات المقدمة الفعلية إلى قاعدة البيانات. يتم تحديثه عند تحديث جدول قاعدة البيانات بالفعل. يوفر هذا الراحة لنا للسيطرة على خطوات تقديم البيانات بأنفسنا. علاوة على ذلك ، من خلال هذا النموذج ، فإنه يقلل بشكل كبير من طول المعاملات ، ويقلل من حركة مرور الشبكة ، وزيادة موثوقية التطبيق. أدناه نقدم وحدة تطبيق محددة لتوضيح كيفية استخدام نموذج البرمجة هذا.
خمسة. مثال برنامج دلفي
(1) وصف خلفية التطبيق
لنفترض أننا نصنع وحدة نمطية لمعالجة ترتيب المنتج. تتضمن هذه الوحدة ثلاثة جداول قاعدة بيانات: طلب جدول الطلب (مع حقول مثل معرف الطلب ، المبلغ الاستدعاء ، تاريخ التاريخ ، اسم العميل Costomer ، وما إلى ذلك) ، تفاصيل الطلب (مع معرف تفاصيل الطلب ، معرف الطلب ، ورقم المنتج) ، الطلب) ، الطلب) التفاصيل (مع معرف الطلب ، معرف الطلب ، ورقم المنتج ، مبلغ الكمية ، وسعر سعر الوحدة وغيرها من الحقول) ، وتخزين جدول المخزون (بما في ذلك عدد المنتجات التجارية ، والأسهم الحالية والمجالات الأخرى). من بينها ، ترتيب وقائمة الطلبات هي علاقات أحادية إلى حد ، مع رقم الطلب OrderID كحقل اتصال. عند إضافة أمر ، يجب تعديل جدول المخزون ويتم طرح كمية البضائع المقابلة المباعة من المخزون.
(2) وصف إطار البرنامج
فيما يلي إطار عمل لبرامج Delphi ، والذي يشرح تقريبًا كيفية استخدام وضع البرمجة لتحديثات ذاكرة التخزين المؤقت. يمكن للقراء زيادة تحسين وظائف هذا البرنامج بأنفسهم.
ترتيب الوحدة ؛
{اسم الوحدة}
واجهة
يستخدم
{الوحدة المرجعية}
Windows ، الرسائل ، sysutils ، المتغيرات ، الفئات ، الرسومات ، عناصر التحكم ، النماذج ،
مربعات الحوار ، الشبكات ، dbgrids ، extctrls ، dbctrls ، الأدوات ، actnman ، actnctrls ،
Actnmenus ، DB ، dbtables ؛
يكتب
{المتغيرات المعلنة ، الضوابط المضافة ، والطرق والإجراءات المحددة}
torderform = فئة (tform)
tborder: ttable ؛
tbdetail: ttable ؛
OrderDB: tdatabase ؛
Actionmainmenubar1: TactionMainmenubar ؛
dbnavigator1: tdbnavigator ؛
dbGrid1: tdbgrid ؛
الإجراء tborderafterPost (مجموعة البيانات: tdataset) ؛
الإجراء tbDetailNewRecord (DataSet: tdataset) ؛
الإجراء tbdetailupdaterecord (مجموعة البيانات: tdataset ؛
updateKind: TupdateKind ؛
الإجراء tbDetailafterPost (DataSet: tdataset) ؛
Formcreate الإجراء (المرسل: TOBJECT) ؛
خاص
{إعلانات خاصة}
عام
{الإعلانات العامة}
نهاية؛
var
Orderform: torderform ؛
تطبيق
{$ r *.dfm}
{ما يلي هو إطار البرنامج الرئيسي}
الإجراء torderform.formcreate (المرسل: tobject) ؛
{قم بتعيين خيارات تحديث ذاكرة التخزين المؤقت للجدول الرئيسي والجدول المفصل إلى True}
يبدأ
tborder.cachedupdates: = true ؛
tbdetail.cachedupdates: = true ؛
نهاية؛
الإجراء torderform.tborderafterpost (DataSet: tdataset) ؛
{بعد إرسال تحديث جدول الطلبات ، قم بتنفيذ محتوى هذه العملية.
ملاحظة: إذا كانت خاصية CacheDupdates لمجموعة البيانات صحيحة ،
ثم الإجراء المنشور هو مجرد عمل ملتزم في المخزن المؤقت للعميل.
بدلاً من إرسالها فعليًا إلى قاعدة البيانات الفعلية. لتحقيق التزام حقيقي ،
بيان applicupdates مطلوب. }
يبدأ
OrderDB.StartTransaction ؛ // تبدأ معاملة التحديث في التنفيذ
يحاول
tborder.applyupdates ؛ // يرجى التحديث الفعلي إلى الجدول الرئيسي
tbdetail.applyupdates ؛ // تحديثات حقيقية إلى القائمة التفصيلية
يستثني
orderdb.rollback ؛ // في حالة حدوث حادث ، ثم راجع المعاملة والخروج من العملية
مخرج؛
نهاية؛
orderdb.commit ؛ // في حالة حدوث أي وقوع ، ثم أكمل التزام المعاملة
tborder.commitupdates ؛ // امسح العميل المخزن المؤقت لجدول tborder
tbdetail.commitupdates ؛ // امسح العميل المخزن المؤقت لجدول tbdetail
نهاية؛
الإجراء torderform.tbDetailNewRecord (DataSet: tdataset) ؛
{تم الانتهاء من الإجراء عند إضافة قائمة مفصلة. }
يبدأ
tbdetail.fieldbyname ('orderid'). asinteger: = tborder.fieldbyname ('orderid'). asinteger ؛
ملف: // تعيين حقل OrderID للجدول الرئيسي إلى حقل OrderID للجدول التفصيلي.
نهاية؛
الإجراء torderform.tbdetailupdaterecord (DataSet: tdataset ؛
updateKind: TupdateKind ؛
{عندما يتم تحديث جدول قاعدة البيانات فعليًا ، يتم تعريف العمليات التي يجب تنفيذها في وقت واحد في حدث OnupDaterCord.
في هذه الحالة ، يتم تنفيذ عملية تحديث متتالية للقائمة التفصيلية وجدول المخزون.
انتبه: العمليات التي تم تنفيذها في هذه العملية هي إجراءات يتم تنفيذها عند تحديث قاعدة البيانات بالفعل.
بدلاً من الإجراءات التي يتم إجراؤها عند تحديث البيانات المخزنة مؤقتًا للعميل}
var temp_query: tquery ؛
يبدأ
إذا كان updateKind = ukinsert ثم ملف: // إذا كان نوع التحديث هو إدراج سجل جديد ، فقم بتحديث مبلغ المخزون المقابل
مع temp_query تفعل
يبدأ
يغلق؛
sql.clear ؛
sql.add ('تحديث مخزون تخزين الأسهم = الأسهم-: المبلغ') ؛
sql.add ('حيث commondityid =: commondityid') ؛
parambyName ('المبلغ'): = tborder.fieldbyname ('المبلغ'). asfloat ؛
parambyName ('commondityid'): = tbdetai.fieldbyname ('commondityId'). asinteger ؛
execsql ؛
نهاية؛
نهاية؛
الإجراء torderform.tbdetailafterpost (DataSet: tdataset) ؛
{بعد تعديل السجلات في الجدول التفصيلي وتقديم (POST) ، قم بتنفيذ العبارات في هذه العملية.
انتبه: يستهدف هذا النوع من التقديم بيانات العميل ولا ينعكس حقًا في قاعدة البيانات.
في هذا المثال ، تتمثل الوظيفة المنفذة في حساب حقل المبلغ الإجمالي للجدول الرئيسي}
يبدأ
tborder.fieldbyname ('money'): = 0 ؛
مع tbdetail تفعل
يبدأ
أولاً؛
بينما لا تفعل eof
يبدأ
tborder.fieldbyname ('money'): = tborder.fieldbyname ('money')+
FieldByName ('price'). asfloat*fieldByName ('extre') ؛
ملف: // تراكم مقدار الجدول التفصيلي إلى حقل المبلغ للجدول الرئيسي
التالي؛
نهاية؛
نهاية؛
نهاية؛
نهاية.