سؤال

أرغب في استخدام JPA عبر JDBC لتطبيق جديد. أنا أستخدم بشكل صارم الاستعلامات المسماة وأساليب CRUD الأساسية لـ JPA Entity Manager ، والتي تتيح لي (بمساعدة Hibernate ، أو أي تطبيق JPA آخر) لاستخراج جميع الاستعلامات الأصلية SQL التي سيتم تنفيذها على قاعدة البيانات. مع هذه القائمة من الاستعلامات الثابتة ، أفهم أنه يمكنني إنشاء حزمة DB2 التي هي جميع خطط تنفيذ طلباتي.

لذا فإن سؤالي هو: هل يؤدي أداء هذه الاستعلامات من خلال JDBC ضد DB2 إلى الاستفادة من خطط التنفيذ هذه أم لا؟ أفهم أن منتج PureQuery يمكنه التقاط قائمة أوامر SQL. هل ، لا يزال من خلال JDBC وليس من خلال API PureQuery محددة ، توفير المزيد؟ مثل هذه ميزة ربط ثابت DB2؟ أم أنها تعادل JDBC؟

شكرا لك على أي إجابة.

هل كانت مفيدة؟

المحلول

تنفيذ تطبيقات JDBC Dynamic SQL فقط (IE DB2 لا تستخدم الحزم الثابتة).

لا يوجد سوى طريقتان للحصول على SQL ثابت (حيث يتم تخزين الاستعلامات في حزمة في قاعدة البيانات): اكتب تطبيقك باستخدام SQLJ (الذي يلغي JPA/Hibernate) أو استخدام PureQuery (الذي يجلس بين JDBC وقاعدة البيانات).

ضع في اعتبارك أنه حتى مع SQL الديناميكي ، يقوم DB2 بتخزين خطط التنفيذ للاستعلامات ، لذلك إذا تم تنفيذها بشكل متكرر بما فيه الكفاية (أي أنها تبقى في ذاكرة التخزين المؤقت) ، فلن ترى النفقات العامة من تجميع الاستعلام. إن ذاكرة التخزين المؤقت مفيدة فقط إذا كانت الاستعلامات عبارة select * from t1 where c1 = 1 ليس هو نفسه select * from t1 where c1 = 2, ، ولا هو select * from t1 where C1 = 1 (الذي يعطي نفس النتيجة ، لكن الاستعلام يختلف). باستخدام علامات المعلمة (select * from t1 where c1 = ?) هو المفتاح. يمكن لـ DBA ضبط حجم ذاكرة التخزين المؤقت للكتالوج للمساعدة في زيادة نسبة الضرب على هذه ذاكرة التخزين المؤقت.

على الرغم من أن التخزين المؤقت يساعد في تجنب تجميع الاستعلام بشكل متكرر ، إلا أنه لا يوفر استقرار الخطة التي يقوم بها SQL Static ، لذلك YMMV.

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