سؤال

وأنا ريتينغ التطبيق الذي يحتاج إلى دوري (كل أسبوع مثلا) حلقة من خلال عدة ملايين من سجلات قاعدة البيانات الائتلاف الوطني العراقي وتنفيذ التعليمات البرمجية على نتائج كل صف.

ومنذ طاولة كبيرة جدا، وأظن أنه عندما أدعو SomeObject.FindAll () أنه يقرأ كل 1.4million الصفوف ومحاولة إرجاع كافة الصفوف في SomeObject [].

هل هناك طريقة يمكنني تنفيذ التعبير SomeObject.FindAll ()، ولكن تحميل القيم في المزيد من DBMS بطريقة ودية؟

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

المحلول

وليس مع FindAll() - التي، كما كنت قد يظن، ومحاولة تحميل جميع الحالات من النوع المحدد في وقت واحد (و، اعتمادا على كيفية كنت قد حصلت على مجموعة NHibernate حتى أن يصدر العدد الهائل من الاستفسارات SQL للقيام بذلك).

وكسلان تحميل يعمل فقط على خصائص الأشياء، وذلك على سبيل المثال إذا كان لديك نوع SomeObjectContainer استمرت الذي كان كخاصية قائمة SomeObject تعيينها في مثل هذه الطريقة التي يجب أن تتطابق مع كل SomeObjects ومع lazy="true"، ثم قام foreach على تلك الممتلكات القائمة، وكنت الحصول على ما تريد، نوع من. افتراضيا، فإن NHibernate إصدار استعلام لكل عنصر في القائمة، وتحميل واحد فقط في المرة الواحدة. بطبيعة الحال، فإن ذاكرة التخزين المؤقت قراءة تنمو عملاقة لفهرس الصور، لذلك كنت على الأرجح بحاجة إلى طرد الكثير.

ما يمكنك القيام به هو قضية استعلام HQL (أو حتى SQL جزءا لا يتجزأ) لاسترداد كافة معرفات لجميع SomeObjects ثم حلقة من خلال معرفات في وقت واحد جلب وجوه ذات الصلة مع FindByPrimaryKey. مرة أخرى، انها ليست أنيقة للغاية.

لنكون صادقين، في مثل هذا الوضع ربما كنت تحويل ذلك إلى وظيفة الصيانة المجدولة في بروك المخزنة - ما لم يكن لديك حقا لتشغيل <م> كود على الكائن بدلا من معالجة البيانات بطريقة ما. قد تزعج الأصوليون الكائن، ولكن أحيانا بروك المخزنة هو الطريق الصحيح للذهاب، وخصوصا في هذا النوع من السيناريو دفعة مهمة.

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