سؤال

أنا أستخدم 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. تأكد أيضا من أن الجدول مفهرسة بشكل صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top