سؤال

لقد تم إعطائي متطلبًا حيث أحتاج إلى دعم قواعد بيانات متعددة في نفس الحالة، لدعم الإيجارات المتعددة.كل قاعدة بيانات لديها مخطط مماثل.يقوم المستخدم بتسجيل الدخول إلى قاعدة بيانات محددة عن طريق الاختيار من القائمة، وستنتقل جميع المكالمات اللاحقة إلى قاعدة البيانات هذه حتى يقوم بتسجيل الخروج.

أرغب في تبديل مصنع الجلسة بشكل سريع داخل HibernateDaoTemplate واحد بناءً على المعلمة المقدمة من قبل العميل.

يمكنني العثور على الكثير من الأشياء حول مصادر بيانات التبديل السريع (وجميع مشكلات المعاملات المرتبطة بذلك) ولكني أرغب في إجراء معاملات جلسة التبديل السريع - مع الاحتفاظ بجميع التخزين المؤقت لكل منها.

ما هي أسهل طريقة للقيام بذلك؟هل تريد تكوين HotSwappableTarget لـ DaoTemplate؟هل يمكن لأي شخص أن يدلني على عينات حول كيفية القيام بذلك؟

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

المحلول

إذا كانت جميع قواعد البيانات متطابقة، فيمكنني أن أقترح استخدام SessionFactory واحد وتوفير تطبيقاتك الخاصة لـ DataSource وCache التي تكون في الواقع "مدركة للمستأجر".(تنفيذ هذه الأمور تافه إلى حد ما:ما عليك سوى الاحتفاظ بخريطة معرف المستأجر -> ذاكرة التخزين المؤقت الحقيقية/مصدر البيانات الحقيقي ثم تفويض جميع المكالمات إلى المكالمة المناسبة).قم بتكوين SessionFactory الفردي لاستخدام ذاكرة التخزين المؤقت ومصدر البيانات الخاصين بالمستأجر.يمكن استخدام ThreadLocal لجعل معرف المستأجر للطلب الحالي متاحًا لأي رمز يحتاج إلى معرفته.

لقد استخدمت هذا النهج من قبل بنجاح لدعم الإيجارات المتعددة.

نصائح أخرى

حيث كنت أعمل، قمنا بذلك عبر متابعة ThreadLocal هذا الدليل. لقد استخدمنا للتو SessionFactory واحدًا وقمنا بتبديل مصدر بياناته بناءً على متغير جلسة يمكن للمستخدم تغييره أثناء تسجيل الدخول.لا أتذكر التفاصيل الدقيقة، ولكن إذا كنت مهتمًا، فيمكنني البحث عن المزيد من المعلومات حول تنفيذنا.

ومع ذلك، فإن الأشخاص في مكان عملي السابق يبتعدون الآن عن هذا النهج ويتجهون نحو قاعدة بيانات مجزأة.بالتأكيد حل أكثر أناقة وأوصيك بإلقاء نظرة عليه.

قم بتوسيع فئة DAO الخاصة بك من HibernateDaoSupport، ثم قم باستدعاء طريقة setSessionFactory()، لإجراء التبديل السريع لقواعد البيانات

يمكنك أيضًا إلقاء نظرة على مشروع Hibernate Shards:

http://www.hibernate.org/414.html

...والذي يركز على إضافة دعم للتقسيم الأفقي إلى Hibernate Core.لا يغطي حتى الآن واجهة برمجة تطبيقات Hibernate الكاملة، ولكنه يدعم جزءًا كبيرًا منها (والذي قد يكون أو لا يكون كافيًا لاحتياجاتك).وبطبيعة الحال، فإنهم يعملون من أجل التغطية الكاملة.

لقد قمت أيضًا بتجربة موفر ذاكرة التخزين المؤقت عبر ThreadLocal وكان الجزء الصعب هو إجراء التبديل السريع على ذاكرة التخزين المؤقت، عليك التأكد من أن SessionFactory ليس لديه أي جلسات نشطة مرتبطة به.والآن أعتقد أن هناك حلًا أفضل بكثير:باستخدام تكوين Spring 3 Java، يمكنك إنشاء SessionFactory الخاص بك بشكل ديناميكي والسماح لـ Spring بالقيام بإدارة ذاكرة التخزين المؤقت نيابةً عنك.

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