كيفية استخدام DB4O iobjectContainer في تطبيق الويب؟ (الحاوية مدى الحياة؟)
-
21-09-2019 - |
سؤال
أقوم بتقييم DB4O للحصول على ثبات لمشروع ASP .NET MVC.
أتساءل كيف يجب أن أستخدم iObjectContainer في سياق ويب فيما يتعلق بعمر الكائن. كما أراها ، يمكنني أن أفعل واحدة مما يلي:
- قم بإنشاء iObjectContainer عند بدء تشغيل التطبيق واحتفظ بنفس المثيل لمدى عمر التطبيق بالكامل.
- إنشاء واحد iobjectcontainer لكل طلب.
- ابدأ خادمًا ، واحصل على عميل iobjectContainer لكل تفاعل قاعدة بيانات.
ما هي الآثار المترتبة على هذه الخيارات ، من حيث الأداء والتزامن؟
نظرًا لأن قاعدة البيانات مغلقة عند فتح iObjectContainer ، فأنا متأكد تمامًا من أن الخيار 2) سيحصل على بعض المشكلات المتعلقة بالتزامن - هل سيكون هذا هو الحال بالنسبة للخيار 1؟
كما أفهمها ، إذا قمت باسترداد كائن من iObjectContainer ، فيجب حفظه بواسطة نفس مثيل iObjectContainer - من أجل أن يتم تحديده على أنه نفس الكائن. لذلك ، إذا اخترت الخيار 3) ، فسيتعين علي استرداد الكائن الأصلي ، وإجراء التغييرات اللازمة (نسخ البيانات من كائن معدّل) ، ثم تخزينه باستخدام نفس iObjectContainer. هل هذا صحيح ؟
المحلول
الخيار 1) يمكن أن تجعلك في مشكلة خطيرة لأنك ستشارك معاملة فعالة بين جميع الطلبات. لا أعتقد أن هذا خيار ممكن.
كما تم تحديده بالفعل ، الخيار 3) محفوف بالمخاطر الخاصة به لأنه سيتعين عليك تتبع هوية الكائن يدويًا - مهمة مملة وعرضة للخطأ للغاية. هذا حقا يدمر كل جمال قاعدة بيانات الكائن. أيضا ، من ما أعرفه النفقات العامة من الخلق IObjectContainer
ليس صغيرًا ، لذا سيكون هذا مكلفًا للغاية.
هذا يتركنا إلى حد كبير مع الخيار 2 ، والذي لا يغلق قاعدة البيانات عند فتحه في وضع خادم العميل بقدر ما أعرف - أين وجدت هذا المعلومات؟ لذا فإن أفضل فكرة هي فتح IObjectServer
عند بدء تشغيل التطبيق وفتح جديد IObjectContainer
لكل مرجع ، أو قم بالتواصل مع خادم بعيد باستخدام TCP Per-Request.