หนึ่ง. แนวคิด
ในสภาพแวดล้อมเครือข่ายแอปพลิเคชันฐานข้อมูลเป็นรูปแบบโครงสร้าง C/S หรือหลายชั้น ในสภาพแวดล้อมนี้การพัฒนาแอปพลิเคชันฐานข้อมูลควรพิจารณาลดจำนวนการส่งข้อมูลเครือข่ายให้มากที่สุดเท่าที่จะเป็นไปได้และปรับปรุงการเกิดขึ้นพร้อมกันให้มากที่สุด ขึ้นอยู่กับวัตถุประสงค์นี้เทคโนโลยีการอัพเดทข้อมูลที่แคชเข้ามา การดำเนินการเสร็จสมบูรณ์ข้อมูลจะถูกส่งไปยังฐานข้อมูลในครั้งเดียวในเวลาที่เหมาะสมซึ่งจะช่วยลดทราฟฟิกเครือข่ายได้อย่างมากลดการโหลดบนเซิร์ฟเวอร์ฐานข้อมูลและปรับปรุงประสิทธิภาพการทำงานพร้อมกัน
ควรกล่าวว่านี่ไม่ใช่เทคโนโลยีใหม่มาก อย่างไรก็ตามผู้เขียนพบว่าโปรแกรมเมอร์บางคนไม่ได้ให้ความสนใจกับการใช้อย่างมีเหตุผลของเทคโนโลยีนี้และยังคงอยู่ภายใต้แนวคิดของแอปพลิเคชันแบบสแตนด์อโลนส่งผลให้เกิดความไร้ประสิทธิภาพหรือข้อผิดพลาดที่อาจเกิดขึ้นในโปรแกรมที่รวบรวม ดังนั้นจึงจำเป็นต้องสรุปข้อดีหลักการและวิธีการใช้เทคโนโลยีนี้ (นำ Delphi เป็นตัวอย่าง)
สอง. ข้อดีและข้อเสีย
เทคโนโลยีการอัปเดตข้อมูลด้วยแคชมีข้อดีดังต่อไปนี้:
(1) ลดทราฟฟิกเครือข่ายและลดเวลาการเข้าถึงข้อมูล ปรับปรุงประสิทธิภาพของตัวดำเนินการฐานข้อมูลลูกค้า
(2) ลดภาระบนเซิร์ฟเวอร์ฐานข้อมูลเนื่องจากการอัปเดตการแก้ไขและการลบซ้ำจำนวนมากสามารถเสร็จสิ้นได้ในบัฟเฟอร์ของไคลเอนต์ซ้ำและผลลัพธ์จะถูกส่งไปยังเซิร์ฟเวอร์ในตอนท้ายเท่านั้น
(3) ลดเวลาในการประมวลผลธุรกรรมได้อย่างมีประสิทธิภาพและลดปริมาณงานของการทำธุรกรรมพร้อมกัน สิ่งนี้จะช่วยให้มั่นใจได้ดีขึ้นว่ามีความสอดคล้องของฐานข้อมูล
เราสามารถยกตัวอย่างเพื่อแสดงให้เห็นถึงความเหนือกว่า: ตัวดำเนินการฐานข้อมูลแทรกบันทึกข้อมูลลงในฐานข้อมูล แต่ทันทีพบว่าบันทึกไม่เป็นไปตามข้อกำหนดดังนั้นเขาจึงลบข้อมูล ในกระบวนการนี้หากใช้เทคโนโลยีการอัพเดทข้อมูลโดยไม่ใช้บัฟเฟอร์ฝั่งเซิร์ฟเวอร์จะทำการแทรกการแทรกหนึ่งครั้งและการดำเนินการลบหนึ่งครั้งและดำเนินการส่งข้อมูลการเดินทางไปกลับสองครั้งบนไคลเอนต์และฝั่งเซิร์ฟเวอร์และหากมีการใช้ข้อมูลดังกล่าว ตารางฐานข้อมูลอื่น ๆ หากวิธีการอัปเดตข้อมูลถูกนำมาใช้กับแคชการดำเนินการแบบผกผันสองขั้นตอนเหล่านี้สามารถทำได้ในบัฟเฟอร์ข้อมูลของไคลเอนต์โดยไม่มีการดำเนินการใด ๆ ไปยังฝั่งเซิร์ฟเวอร์และจะไม่มีการส่งข้อมูลเครือข่ายและการอัปเดตข้อมูลแบบเรียงซ้อน สิ่งนี้แสดงให้เห็นถึงข้อดีอย่างมากของเทคโนโลยีการอัปเดตข้อมูลบัฟเฟอร์
ข้อเสียอย่างหนึ่งของการอัปเดตข้อมูลด้วยแคชคือเนื่องจากข้อมูลถูกเก็บไว้ในไคลเอนต์หากผู้ใช้รายอื่นเปลี่ยนแปลงข้อมูลจะทำให้เกิดสถานการณ์ที่ไม่สอดคล้องกันเช่นการสูญเสียและการดัดแปลง พิจารณาตัวแปรอย่างเต็มที่ การประยุกต์ใช้เทคโนโลยีนี้ต้องการทักษะบางอย่างและการเปลี่ยนแปลงการคิดบางอย่าง
สาม. หลักการแอปพลิเคชัน
ข้อดีของเทคโนโลยีใด ๆ สะท้อนให้เห็นในสภาพแวดล้อมที่แน่นอน
(1) โอกาสแอปพลิเคชันฐานข้อมูล C/S หรือหลายชั้น ในกรณีนี้การรับส่งข้อมูลเครือข่ายสามารถลดลงได้อย่างมีประสิทธิภาพ ในสถานการณ์แบบสแตนด์อโลนเทคโนโลยีไม่สมเหตุสมผล
(2) ในกรณีของการอัปเดตข้อมูลของหลายตาราง ตัวอย่างเช่นในการอัปเดตของตารางหลัก/รายละเอียดโครงสร้างการเพิ่มและการลบของสองตารางมักจะส่งผลกระทบซึ่งกันและกัน สิ่งนี้จะช่วยลดเวลาในการทำธุรกรรมได้อย่างมีประสิทธิภาพและทำให้มั่นใจได้ว่าข้อมูลสอดคล้องกันได้ดีขึ้น
(3) ในโอกาสที่ความสามารถในการโหลดเซิร์ฟเวอร์มี จำกัด ทุกวันนี้ด้วยการเพิ่มความเร็วของพีซีและราคาที่ลดลงความแตกต่างของความสามารถของลูกค้าและเซิร์ฟเวอร์นั้นมีขนาดเล็กลงและเล็กลงและความสามารถในการให้บริการของเซิร์ฟเวอร์นั้นลดลงค่อนข้างมาก อย่างเป็นกลางจำเป็นต้องลดภาระบนเซิร์ฟเวอร์จากมุมมองของซอฟต์แวร์ในขณะที่การอัปเดตข้อมูลบัฟเฟอร์ลดภาระบนเซิร์ฟเวอร์โดยการแบ่งปันส่วนหนึ่งของงานอัปเดตโดยไคลเอนต์
(4) ในกรณีที่ความน่าจะเป็นของข้อมูลที่ได้รับการปรับปรุงในเวลาเดียวกันค่อนข้างต่ำ หากข้อมูลเดียวกันในฐานข้อมูลมีแนวโน้มที่จะได้รับการอัปเดตโดยผู้ใช้หลายคนในช่วงเวลาเดียวกันสถานการณ์นี้ไม่เหมาะสำหรับการอัปเดตแคชเนื่องจากในกรณีนี้การเขียนทับข้อมูลข้อผิดพลาดจะถูกสร้างขึ้นอย่างง่ายดายส่งผลให้ข้อมูลไม่สอดคล้องกัน
สี่. ภาพรวมของวิธีการควบคุมใน Delphi
ในฐานะเครื่องมือพัฒนาฐานข้อมูลยอดนิยม Delphi มีฟังก์ชั่นการจัดการฐานข้อมูลที่สมบูรณ์ Delphi ให้การสนับสนุนที่ครอบคลุมสำหรับเทคโนโลยีการเข้าถึงข้อมูลบัฟเฟอร์ โดยทั่วไป Delphi ให้ผู้ใช้ชุดควบคุมข้อมูลหลายชุดสำหรับการเข้าถึงตารางฐานข้อมูลเช่น TTable และ TQuery; มีตัวเลือก CachedUpdate ในการควบคุมคุณสมบัติของชุดข้อมูล เฉพาะเมื่อมีการเรียกใช้วิธีการที่ส่งจริง (เช่น appleupdates () ฯลฯ ) Delphi สะท้อนข้อมูลที่ส่งจริงไปยังฐานข้อมูล ได้รับการอัปเดตเมื่อตารางฐานข้อมูลได้รับการอัปเดตจริง สิ่งนี้ให้ความสะดวกสบายสำหรับเราในการควบคุมขั้นตอนของการส่งข้อมูลด้วยตนเอง ยิ่งไปกว่านั้นผ่านโมเดลนี้จะลดความยาวของการทำธุรกรรมลดการรับส่งข้อมูลเครือข่ายและเพิ่มความน่าเชื่อถือของแอปพลิเคชัน ด้านล่างเราให้โมดูลแอปพลิเคชันเฉพาะเพื่อแสดงวิธีใช้รูปแบบการเขียนโปรแกรมนี้
ห้า. ตัวอย่างโปรแกรม Delphi
(1) คำอธิบายพื้นหลังแอปพลิเคชัน
สมมติว่าเราสร้างโมดูลสำหรับการประมวลผลคำสั่งซื้อผลิตภัณฑ์ โมดูลนี้เกี่ยวข้องกับตารางฐานข้อมูลสามตาราง: คำสั่งซื้อตารางการสั่งซื้อ (พร้อมฟิลด์เช่นรหัสคำสั่งซื้อจำนวนเงินจำนวนวันที่วันที่ลูกค้าชื่อลูกค้า ฯลฯ ) รายละเอียดการสั่งซื้อ (พร้อมรหัสรายละเอียดการสั่งซื้อรหัสคำสั่งซื้อและหมายเลขผลิตภัณฑ์ commondityId) การสั่งซื้อ รายละเอียด (พร้อมรหัสคำสั่งซื้อรหัสคำสั่งซื้อและหมายเลขผลิตภัณฑ์ pommondityID จำนวนเงินราคาราคาต่อหน่วยและฟิลด์อื่น ๆ ) การจัดเก็บตารางสินค้าคงคลัง (รวมถึงหมายเลขผลิตภัณฑ์ pommondityId หุ้นที่มีอยู่และฟิลด์อื่น ๆ ) ในหมู่พวกเขาคำสั่งซื้อและรายการคำสั่งซื้อเป็นความสัมพันธ์แบบหนึ่งต่อหลายคนโดยมีหมายเลขคำสั่งซื้อเป็นฟิลด์การเชื่อมต่อ เมื่อใดก็ตามที่มีการเพิ่มคำสั่งซื้อตารางสินค้าคงคลังจะต้องได้รับการแก้ไขและปริมาณของสินค้าที่เกี่ยวข้องที่ขายจะถูกลบออกจากสินค้าคงคลัง
(2) คำอธิบายกรอบโปรแกรม
ต่อไปนี้เป็นกรอบสำหรับโปรแกรม Delphi ซึ่งอธิบายวิธีการใช้โหมดการเขียนโปรแกรมของการอัปเดตแคช ผู้อ่านสามารถปรับปรุงฟังก์ชั่นของโปรแกรมนี้ได้ด้วยตนเอง
ลำดับหน่วย;
{ชื่อหน่วย}
ส่วนต่อประสาน
ใช้
{โมดูลอ้างอิง}
Windows, ข้อความ, sysutils, ตัวแปร, คลาส, กราฟิก, การควบคุม, รูปแบบ,
กล่องโต้ตอบ, กริด, dbgrids, extctrls, dbctrls, toolwin, actnman, actnctrls,
Actnmenus, DB, DBTables;
พิมพ์
{ตัวแปรประกาศเพิ่มการควบคุมและวิธีการและขั้นตอนที่กำหนดไว้}
torderform = class (tform)
tborder: ttable;
tbdetail: ttable;
orderdb: tdatabase;
ActionMainMenubar1: TactionMainMenubar;
dbnavigator1: tdbnavigator;
dbgrid1: tdbgrid;
โพรซีเดอร์ tborderafterpost (ชุดข้อมูล: tDataset);
โพรซีเดอร์ tbdetailNewRecord (ชุดข้อมูล: TDATASET);
โพรซีเดอร์ tbdetailupdaterecord (ชุดข้อมูล: tDataset;
UpdateKind: tupdatekind;
โพรซีเดอร์ tbdetailafterpost (ชุดข้อมูล: tDataset);
โพรซีเดอร์แบบฟอร์ม (ผู้ส่ง: tobject);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
วาจา
orderform: torderform;
การดำเนินการ
{$ r *.dfm}
{ต่อไปนี้เป็นกรอบโปรแกรมหลัก}
ขั้นตอน torderform.formCreate (ผู้ส่ง: tobject);
{ตั้งค่าตัวเลือกการอัปเดตแคชสำหรับตารางหลักและตารางรายละเอียดเป็นจริง}
เริ่ม
tborder.cachedupdates: = true;
tbdetail.cachedupdates: = true;
จบ;
ขั้นตอน torderform.tborderafterpost (ชุดข้อมูล: tDataset);
{หลังจากส่งการอัปเดตของตารางการสั่งซื้อให้ดำเนินการเนื้อหาของกระบวนการนี้
หมายเหตุ: หากคุณสมบัติ cachedupdates ของชุดข้อมูลเป็นจริง
จากนั้นการดำเนินการโพสต์เป็นเพียงการกระทำที่กระทำในบัฟเฟอร์ลูกค้า
แทนที่จะส่งไปยังฐานข้อมูลจริง เพื่อให้บรรลุการกระทำที่แท้จริง
จำเป็นต้องใช้คำสั่ง ApplicUpDates -
เริ่ม
orderdb.startTransaction; // การอัปเดตธุรกรรมเริ่มดำเนินการ
พยายาม
tborder.applyUpdates; // โปรดอัปเดตจริงไปยังตารางหลัก
tbdetail.applyUpdates; // การอัปเดตจริงในรายการรายละเอียด
ยกเว้น
orderdb.rollback; // หากเกิดอุบัติเหตุจากนั้นย้อนกลับการทำธุรกรรมและออกจากกระบวนการ
ออก;
จบ;
orderdb.commit; // หากไม่มีอุบัติเหตุเกิดขึ้นให้ทำธุรกรรมให้เสร็จสิ้น
tborder.CommitupDates; // ล้างบัฟเฟอร์ไคลเอนต์ของตาราง tBorder
tbdetail.commitupdates; // ล้างบัฟเฟอร์ไคลเอนต์ของตาราง tbdetail
จบ;
ขั้นตอน torderform.tbdetailNewRecord (ชุดข้อมูล: tDataset);
{การกระทำเสร็จสมบูรณ์เมื่อมีการเพิ่มรายละเอียดรายการ -
เริ่ม
tbdetail.fieldbyname ('orderId'). asinteger: = tborder.fieldbyname ('orderid'). asinteger;
ไฟล์: // กำหนดฟิลด์ ORDERID ของตารางหลักไปยังฟิลด์ orderId ของตารางรายละเอียด
จบ;
ขั้นตอน torderform.tbdetailupdaterecord (ชุดข้อมูล: tdataset;
UpdateKind: tupdatekind;
{เมื่อตารางฐานข้อมูลได้รับการอัปเดตจริงการดำเนินการที่ต้องดำเนินการพร้อมกันจะถูกกำหนดไว้ในเหตุการณ์ onupdaterecord
ในกรณีนี้การดำเนินการอัปเดตแบบเรียงซ้อนของรายการรายละเอียดและตารางสินค้าคงคลังจะดำเนินการ
ให้ความสนใจ: การดำเนินการที่ดำเนินการในกระบวนการนี้เป็นการกระทำที่ดำเนินการเมื่อฐานข้อมูลได้รับการอัปเดตจริง
แทนที่จะดำเนินการเมื่ออัปเดตข้อมูลแคชของลูกค้า}
var temp_query: TQuery;
เริ่ม
หาก updatekind = ukInsert ไฟล์: // หากประเภทการอัปเดตคือการแทรกระเบียนใหม่ให้อัปเดตจำนวนสินค้าคงคลังที่เกี่ยวข้อง
ด้วย temp_query ทำ
เริ่ม
ปิด;
sql.clear;
SQL.ADD ('Update Storage Set Stocks = Stocks-: จำนวนเงิน');
sql.add ('โดยที่ commondityid =: commondityId');
paramByName ('จำนวน'): = tBorder.fieldByName ('จำนวน'). asfloat;
parambyName ('commondityId'): = tbdetai.fieldbyname ('commondityId'). asinteger;
execsql; ไฟล์: // ดำเนินการคำสั่ง SQL เพื่ออัปเดตสินค้าคงคลังและลบจำนวนสินค้าคงคลังที่เกี่ยวข้อง
จบ;
จบ;
ขั้นตอน torderform.tbdetailafterpost (ชุดข้อมูล: tDataset);
{หลังจากแก้ไขระเบียนในตารางโดยละเอียดและส่ง (โพสต์) ดำเนินการคำสั่งในกระบวนการนี้
ให้ความสนใจ: การส่งประเภทนี้มีเป้าหมายที่ข้อมูลลูกค้าและไม่ได้สะท้อนให้เห็นในฐานข้อมูล
ในตัวอย่างนี้ฟังก์ชั่นที่นำไปใช้คือการคำนวณฟิลด์จำนวนเงินทั้งหมดของตารางหลัก}
เริ่ม
tborder.fieldbyname ('เงิน'): = 0;
ด้วย tbdetail do
เริ่ม
อันดับแรก;
ในขณะที่ไม่ได้ทำ
เริ่ม
tborder.fieldbyname ('money'): = tborder.fieldbyname ('money')+
FieldByName ('ราคา'). asfloat*fieldByName ('จำนวน');
ไฟล์: // สะสมจำนวนตารางรายละเอียดไปยังฟิลด์จำนวนเงินของตารางหลัก
ต่อไป;
จบ;
จบ;
จบ;
จบ.