في الأساس ، تحتوي المقالات على الإنترنت على مصادر بيانات متعددة فقط أو مصادر بيانات ديناميكية فقط ، في حين تحتاج المشروعات الحديثة إلى استخدام طريقتين في نفس الوقت. دعنا نسجل طرق التكوين للرجوع إليها.
سيناريوهات التطبيق
يحتاج المشروع إلى توصيل قواعدتين مختلفتين A و B في نفس الوقت ، وكلاهما من البنية الرئيسية العبد ، ومكتبة كتابة واحدة ومكتبات قراءة متعددة.
مصادر بيانات متعددة
أولاً ، يجب عليك تعطيل تكوين DataSourCeautOconfiguration الذي يأتي مع صندوق الربيع ، لأنه سيقرأ spring.datasource.* خاصية ملف Application.Properties وتكوين مصدر بيانات واحد تلقائيًا. فقط أضف السمة الاستبعاد إلى @springbootapplication enountation:
springbootapplication (exclude = {dataSourCeautOconFiguration.Class}) الفئة العامة titanwebapplication {public static void main (string [] args) {springapplication.run (titanwebapplication.class ، args) ؛ }}ثم قم بتكوين معلومات اتصال مصدر البيانات المتعددة في Application.Properties:
# مكتبة تيتان spring.datasource.titan-master.url = jdbc: mysql: // xxxx: port/titan؟ distarycoding = utf-8spring.datasource.titan-master.u sername = spring.datasource.titan-master.password = spring.datasource.titan-master.driver-class-name = com.mysql.jdbc.driver# تكوين تجمع الاتصال# حذف# المكتبات الأخرى spring.datasource.db2.url = jdbc: mysql: // xxxx: port/titan2؟ characterencoding = utf-8spring.datasource.db2.username = spring.datasource.db2.Password = spring.datasource.db2.driver-class-name =
نظرًا لأننا قمنا بتعطيل تكوين مصدر البيانات التلقائي ، نحتاج إلى إنشاء مصادر البيانات هذه يدويًا في الخطوة التالية:
ConfigurationPublic class dataSourCeConfig {bean (name = "titanmasters") configurationProperties (prefix = "spring.datasource.titan-master") } bean (name = "ds2") configurationProperties (prefix = "spring.datasource.db2") // بادئة الخاصية المقابلة في application.properteis public dataSource dataSource2 () {return datasourceBuilder.create (). }}بعد ذلك ، تحتاج إلى تكوين اثنين من mybatis sqlsessionfactory لاستخدام مصادر البيانات المختلفة:
@configuration @mapperscan (basePackages = {"titan.mapper"} ، sqlsessionfactoryref = "sqlsessionfactory1") الطبقة العامة mybatisdbaconfig {autowired qualifier ("titanmastersdsdsds") بيانات خاصة ؛ bean public sqlsessionfactory sqlsessionfactory1 () يلقي الاستثناء {sqlsessionfactorybean factorybean = sqlsessionfactorybean () ؛ Factorybean.setDatasource (DS1) ؛ // استخدم مصدر بيانات Titan للاتصال بمكتبة Titan Return Factorybean.getObject () ؛ } bean public sqlsessionTemplate sqlsessionTemplate1 () يلقي استثناء {sqlsessionTemplate template = new SqlSessionTemplate (sqlsessionfactory1 ()) ؛ // استخدم المصنع الذي تم تكوينه أعلاه لإرجاع القالب ؛ }}بعد التكوين أعلاه ، ستستخدم واجهة Mapper ضمن Titan.Mapper مصدر بيانات Titan. وبالمثل ، يمكنك استخدام SQLSessionFactory الثاني:
@configuration @mapperscan (basePackages = {"other.mapper"} ، sqlsessionfactoryref = "sqlsessionfactory2") الفئة العامة mybatisdbconfig {autowired Qalifier ("ds2") البيانات الخاصة ds2 ؛ @bean public sqlsessionfactory sqlsessionfactory2 () يلقي الاستثناء {sqlsessionfactorybean factorybean = sqlsessionfactorybean () ؛ Factorybean.setDatasource (DS2) ؛ إرجاع Factorybean.getObject () ؛ } bean public sqlsessionTemplate sqlsessionTemplate2 () يلقي استثناء {sqlsessionTemplate template = new SqlSessionTemplate (sqlsessionfactory2 ()) ؛ قالب العودة. }}بعد الانتهاء من هذه التكوينات ، لنفترض أن هناك 2 mapper titan.mapper.usermapper وغيرها. mapper.rolemapper. عند استخدام السابق ، سيتم توصيل مكتبة Titan تلقائيًا ، وسيتم توصيل الأخير بمكتبة DS2.
مصادر البيانات الديناميكية
تتمثل القصد الأصلي لاستخدام مصادر البيانات الديناميكية في فصل القراءة والكتابة على طبقة التطبيق ، أي للتحكم في طرق الاستعلام المختلفة في رمز البرنامج للاتصال بمكتبات مختلفة. بالإضافة إلى هذه الطريقة ، يعد Database Middleware أيضًا اختيارًا جيدًا. مصلحتها هي أن مجموعة قاعدة البيانات تتعرض فقط لمكتبة واحدة للتطبيق ولا تحتاج إلى تبديل منطق رمز مصدر البيانات.
ندرك تبديل مصدر البيانات الديناميكي من خلال التعليقات التوضيحية المخصصة + AOP.
حدد أولاً contextholder لحفظ اسم مصدر البيانات المستخدمة بواسطة مؤشر الترابط الحالي:
الفئة العامة dataSourCeContextholder {public static final logger log = loggerFactory.getLogger (datasourceContextholder.class) ؛ / *** مصدر البيانات الافتراضي*/ السلسلة النهائية الثابتة العامة default_ds = "Titan-Master" ؛ private Static Final Threadlocal <string> contextholder = new threadlocal <> () ؛ // قم بتعيين اسم مصدر البيانات public static void setdb (String dBtype) {log.debug ("Switch to {} data source" ، dbtype) ؛ contextholder.set (dbtype) ؛ } // احصل على اسم مصدر البيانات public Static String getDB () {return (contextholder.get ()) ؛ }. }}ثم تخصيص تنفيذ واجهة javax.sql.datasource. هنا تحتاج فقط إلى أن ترث فئة الأصل AbstractractRoutingDataSource التي نفذها الربيع لنا مقدمًا:
يمتد DynamicDataSource من الطبقة العامة abstractractroutingdatasource {logger private static final logger = loggerfactory.getLogger (DynamicDataSource.Class) ؛ Override محمي كائن DETERNECURRENTOKTOFKUPKEY () {log.debug ("مصدر البيانات هو {}" ، datasourceContextholder.getDB ()) ؛ إرجاع datasourceContextholder.getDB () ؛ }}إنشاء مصادر بيانات ديناميكية:
/ *** مصدر البيانات الديناميكي: التبديل الديناميكي بين مصادر البيانات المختلفة من خلال AOP* regurn*/ @bean (name = "dynamicds1") dataSource public dataSource () {DynamicDataSource DynamicDataSource = new DynamicDataSource () ؛ // data data source dynamicdataSource.setDefaultTargetDataSource (datasource1 ()) ؛ // تكوين خريطة مصدر متعددة data <كائن ، كائن> dsmap = new hashmap (5) ؛ dsmap.put ("Titan-Master" ، datasource1 ()) ؛ dsmap.put ("ds2" ، datasource2 ()) ؛ DynamicDataSource.SetTargetDataSources (DSMAP) ؛ إرجاع DynamicDataSource ؛ }يتم استخدام التعليقات التوضيحية المخصصة لتحديد مصدر البيانات الذي تستخدمه الطريقة عند الترميز:
recentention (attreentionpolicy.runtime) target ({elementType.method}) public interface ds {string value () الافتراضي "Titan-Master" ؛}اكتب أقسام AOP لتنفيذ منطق التبديل:
@Side@componentpublic class class dynamicdataSourCeaspect {bebere ("@enrotation (ds)") public void beorforeswitchds (point point) {// الحصول على فئة الوصول الحالية <؟> className = point.getTarget (). getClass () ؛ // احصل على اسم طريقة الوصول إلى سلسلة methodName = point.getSignature (). getName () ؛ // احصل على نوع المعلمة من فئة الطريقة [] argClass = ((MaysIngureature) point.getSignature ()). getParameterTypes () ؛ سلسلة dataSource = datasourCeContextholder.default_ds ؛ حاول {// كائن الطريقة الذي تم الوصول إليه هو طريقة = className.getMethod (MethodName ، argClass) ؛ // تحديد ما إذا كان التعليق التوضيحي @DS موجود إذا (method.isannotationpresent (ds.Class)) {ds enrotation = method.getAnnotation (ds.Class) ؛ // قم بإخراج اسم مصدر البيانات في DataSource = annotation.value () ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }. } apter (" @enrotation (ds)") public void peherstswitchds (JoinPoint point) {dataSourCeContexTholder.cleardb () ؛ }}بعد الانتهاء من التكوين أعلاه ، تحديد DynamicDataSource في تكوين SQLSessionFactory السابق لاستخدام DynamicDataSource لتبديل مصادر البيانات بسعادة في الخدمة:
@autowired userAmodelMapper userAmapper ؛ DS ("Titan-Master") public string ds1 () {return userAmapper.SelectByPrimaryKey (1) .getName () ؛ }ds ("ds2") public string ds2 () {return userAmapper.SelectByPrimaryKey (1) .getName () ؛ }لخص
ما سبق هو SPRING BOOT + MYBATIS Multi-DATA Source وطريقة تكوين مصدر البيانات الديناميكية المقدمة لك من قبل المحرر. آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!