السبات DisplayTag قوائم كبيرة
-
20-09-2019 - |
سؤال
أنا أستخدم DisplayTag لإنشاء جداول مع البيانات من DB. يعمل هذا بشكل جيد إذا كانت القائمة المطلوبة ليست كبيرة ولكن إذا كان حجم القائمة ينمو أكثر من 2500 مداخل، فإن جلب قائمة النتائج تتطلب طويلا (أكثر من 5 دقائق). كنت أتساءل عما إذا كان هذا السلوك طبيعيا.
كيف تتعامل مع القائمة / الاستفسارات الكبيرة التي ترجع نتائج كبيرة؟
المحلول
هذه المقالة روابط إلى تطبيق مثال لكيفية الذهاب حول حل المشكلة. تتوقع DisplayTag أن يتم تمرير مجموعة بيانات كاملة لإنشاء روابط الترحيل والفرز. هذا النوع من فكر فكرة الترحيل خارجيا على البيانات ويحمل فقط الصفوف التي يطلب منها (كصفحات المستخدم لهم). يصف المشروع المرتبط به في المقالة كيفية الذهاب حول تحديد هذا النوع من الأشياء.
إذا كنت تعمل مع قاعدة بيانات كبيرة، فيمكنك أيضا وجود مشكلة في تنفيذ الاستعلام الخاص بك. أفترض أنك قضيت ذلك. إذا لم يكن كذلك، لديك SQL كما هو مذكور سابقا - أود تشغيله من خلال محلل الاستعلام DB2 لمعرفة ما إذا كان هناك أي اختناقات DB. تصعيد السلسلة التالية هو تشغيل اختبار لاستدعاء السبات / DAO في اختبار الوحدة دون عرض DisplayTag في المزيج. مرة أخرى، من كيفية صياغة الأشياء، يبدو أنك فعلت ذلك بالفعل.
نصائح أخرى
يقوم DisplayTag Hauls وتخزين كل شيء في الذاكرة (الجلسة). السبات كذلك يفعل ذلك. لا تريد أن تتمتع بمحتويات جدول DB بالكامل في الذاكرة (ومع ذلك، إذا بدأ التباطؤ بالفعل عند 2500 صفوف، فهذا يشبه مسألة مسألة استعلام SQL / DB الأمثل بشكل سيء؛ 2500 صفوف يجب أن تكون الفول السوداني ل DB لائق، ولكن حسنا، هذه قصة أخرى).
بدلا من إنشاء جدول HTML بنفسك مع القليل من المساعدة jstl. c:forEach
و طلقة إمرأة. وبعد الحفاظ على واحد أو اثنين من المعلمات طلب في الخلفية في input type="hidden"
: الصف الأول الذي سيتم عرضه (firstrow
) وفي النهاية يتم عرض كمية الصفوف في وقت واحد (rowcount
).
ثم، في فئة DAO الخاصة بك فقط تفعل SELECT stuff FROM data LIMIT firstrow OFFSET rowcount
أو شيء من هذا القبيل اعتمادا على DB المستخدمة. في MySQL و postgresql يمكنك استخدام LIMIT
و / أو OFFSET
جملة من هذا القبيل. في Oracle، ستحتاج إلى إطلاق النار في MSSQL و DB2، ستحتاج إلى إنشاء SP. يمكنك أن تفعل ذلك مع HQL.
ثم، إلى الصفحة من خلال الجدول، ما عليك سوى الحصول على أزرار حفنة تؤدي إلى رمز جانب الخادم في / تقليل firstrow
مع rowcount
كل مره. فقط تفعل الرياضيات.
تعديل: لقد علقت أنك تستخدم DB2. لقد قمت بإجراء بحث بعض الشيء ويبدو أنه يمكنك استخدام وظيفة UDB OLAP ROW_NUMBER()
لهذا:
SELECT id, colA, colB, colC
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY id) AS row, id, colA, colB, colC
FROM
data
) AS temp_data
WHERE
row BETWEEN 1 AND 10;
يجب أن يرجع هذا المثال أول 10 صفوف من data
الطاولة. يمكنك تحديد هذا الاستعلام هذا الاستعلام حتى تتمكن من إعادة استخدامه لكل صفحة. هذا أكثر فعالية من الاستعلام عن الجدول بأكمله في ذاكرة Java. تأكد أيضا من أن الجدول مفهرسة بشكل صحيح.