مشكلة في منظومة على شبكة
#1
السلام عليكم
اشتشارني احدهم قائلا عندي منظومة تعمل على شبكة وواجهتها الرئيسية فيها الاداة DBgrid تعرض بيانات الموظفين ولنقل 4000 الالاف سجل .
المهم ان طريقته هو انه جعل هناك مؤقت يقوم على تحديث هذه القائمة كل ثانية .
ولكن المنظومة صارت بطيئة بشكل كبير جدا .
من جهتي قلت له انك تقوم على تحديث البيانات في كل الاجهزة الطرفية حتى وان كانت غير مشغولة .
اي تنقل البيانات بين الاجهزة بلا داع .
لذلك اعطيت حلول .
1. اجعل زر للتحديث كلما اراد احد تحديث البيانات ينقر على الزر
2. لا تحدث الا البيانات التي في الصورة فقط قلت لماذا تحدث 4000 سجل بينما الذي على الشاشة عشرون .
3. اجعل مؤقت يتحسس حركة الفأرة ولوحة المفاتيح اذا توقفت عن العمل لا تحدث البيانات للاجهزة هذه
4. الابتعاد عن استخدام الامر Locate في البحث لانه يجلب كل البيانات تم ينتقل الى السجل المطلوب واستخدام الاستعلام المباشر

هذه بعض النصائح .
هل هي صحيحة ام هناك طرق اخرى .
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#2
نعم كلها صحيحة
كذلك عند اعادة الاستخدام مرة اخرى سوى كانت بمؤقت او بزر تاكد من استخدام الامر
adodable.disablecontrol
لايقاف ارتباط القريد او اي مكون متصل بالبيانات وهذا يؤثر في سرعة العرض
الرد
#3
هناك طريقة أخرى للتخلص من إستهلاك موارد النظام
التايمر او المبرمج لايقومان بالتخلص من موارد النظام التي استهلكت ويتركانها تتراكم
لقد حدث لي هذا في برنامج تسيير مقهى الانترنت
الحل هو : استدعاء الامر Free

مثال بسيط:

في هذا المثال يمكن لبرنامجي أن يستهلك مقدارا من موارد النظام بمرور الوقت ويتظاعف ذلك تدريجيا

Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
if Label1.Caption = '3' then
begin
Timer1.Enabled := False;
Label1.Caption := '0';
end;

المثال التالي يتم التخلص من المشكل بتحرير موارد النظام
Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
if Label1.Caption = '3' then
begin
Timer1.Enabled := False;
Label1.Caption := '0';
Timer1.FreeOnRelease();
end;
الرد
#4
(10-03-2016, 07:50 PM)Manarsoft كتب : هناك طريقة أخرى للتخلص من إستهلاك موارد النظام
التايمر او المبرمج لايقومان بالتخلص من موارد النظام التي استهلكت ويتركانها تتراكم
لقد حدث لي هذا في برنامج تسيير مقهى الانترنت
الحل هو : استدعاء الامر Free

مثال بسيط:

في هذا المثال يمكن لبرنامجي أن يستهلك مقدارا من موارد النظام بمرور الوقت ويتظاعف ذلك تدريجيا

Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
if Label1.Caption = '3' then
begin
Timer1.Enabled := False;
Label1.Caption := '0';
end;

المثال التالي يتم التخلص من المشكل بتحرير موارد النظام
Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
if Label1.Caption = '3' then
begin
Timer1.Enabled := False;
Label1.Caption := '0';
Timer1.FreeOnRelease();
end;

كم برأيك سيستهلك التايمر من موارد
لا اعتقد انه بهذه الاهمية في استهلاك الموارد
ولكن البيانات هي التي تسبب مشكلة
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#5
أنا قلت لك بمرور الوقت يتم استهلاك موارد النظام
البيانات لا تسبب أي مشكلة، ولو كانت تسبب مشكلة فما الداعي لتطوير قواعد بيانات ضخمة كـOracle و MySQL وغيرها؟
هناك قواعد بيانات تحتوي على كمية لا حصر لها من السجلات ول نسمع يوما أن الكمية سببت مشكلة
في أحد الويبينار لشركة PCSOFT قاموا بتجربة قاعدة بيانات تحتوي على ملايير السجلات
أحد البنوك السويسرية تقول أن أنظمتها تعالج أكثر من 150 مليون طلب يوميا.
DevExpress تقول أنها تقوم بإجراء إستعلام لمليون سجل في الوقت الحقيقي بدون مشكل.
أنا جربت قاعدة بيانات بها 10000 سجل بدون مشكل في الفلترة
الصقر يحلق وحيدا .. الغربان تحلق جماعات
[-] كل من 1 user says قال شكرا ل Manarsoft على المشاركة المفيدة
  • wadoud
الرد
#6
يا اخي انت تتحدث عن برنامج يعمل على جهاز واحد

ونحن نتحدث عن برنامج يعمل على شبكة قد تكون قريبة لعشرات الامتار وقد تكون لمئات الامتار .

وهذه ستكون البيانات في نقلها مشكلة .
خاصة بعد ان تنقلها بين الاجهزة كل ثانية .

وانا احدتك عن واقع عملي لمنظومة صديق .

والتايمر الذي سيعمل على جهاز العميل سيستهلك جزء بسيط لا يذكر من موارد الجهاز .
ولا يتم ايقافه لتحريره من الذاكرة .
لانه يعمل على طول .
ولو انه يتم انشاءه تم غلقه بشكل متكرر لقلت ربما .

وبالنهاية عملية نقل البيانات الكثيرة ستكون عبئ على السيرفر .
لانه سيستقبل الكثير من الطلبات من الاجهزة الطرفية كل ثانية .
ويقوم باعدادها وارسالها .
ولا اتحدث عن جودة قواعد البيانات وفي قدرتها التخزينية .

تم انت تتحدث عن سيرفرات سويسرية لبنوك انت تتحدث عن سيرفرات عملاقة .
والسيرفرات التي بالادارات هنا اجهزة عادية لا ترقى الى تلك
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#7
إقتباس :منظومة تعمل على شبكة وواجهتها الرئيسية فيها الاداة DBgrid تعرض بيانات الموظفين ولنقل 4000 الالاف سجل
المسالة من البداية خطأ: وضع DBGrid كواجهة لبرنامج يعمل على الشبكة!
في برمجة الشبكات القاعدة عامة تقول
لا تتصل الا عند الحاجة
لا تبقى متصلا لوقت طويل (اتصل، اقضي حاجتك ثم اقطع الاتصال)
عند الاتصال اطلب فقط ما تحتاج من بيانات
ان كنت تتصل كثير استخدت Connection Pooling
حاول جعل منطق العمل business logic ما استطعت بجهة الخادم Server
انسى مكونات TTable فكر فقط باستعلامات SQL ما استطعت!
...
نعود للموضوع 4000 الاف سجل ليس بالعدد الكبير يمكن الاتصال والحصول عليها خلال ثوان، المشكل بمنطق عمل البرنامج
انسى فكرة استخدام Timer واستخدم ما توفره لك قاعدة البيانات المستخدمة مثلا Events مع Firebird
http://www.firebirdsql.org/file/document...events.pdf
رَبَّنَا اغْفِرْ لِي وَلِوَالِدَيَّ وَلِلْمُؤْمِنِينَ يَوْمَ يَقُومُ الْحِسَابُ
[-] كل من 3 users say قال شكرا ل محمد عبد العزيز على المشاركة المفيدة
  • Delphi4Us, h-farid, wadoud
الرد
#8
[quote='B.M.AbdelAziZ' pid='37638' dateline='1457857155']
إقتباس :انسى فكرة استخدام Timer واستخدم ما توفره لك قاعدة البيانات المستخدمة مثلا Events مع Firebird
http://www.firebirdsql.org/file/document...events.pdf

هل هذا يعني انه وبواسطة مكون مختص بالـ Event مع مكونات مثل زيوس مثلا يمكن للبرنامج في جهاز طرفي ان يقتنص حدث تحديث لسجل او اضافة او حذف...؟

بحيث يقوم بتحديث البيانات فقط اذا حدث تحديث للبيانات بقاعدة البيانات .
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم