الربيع AOP ، يدرك تكوين MySQL Master-Slave فصل القراءة والكتابة. بعد ذلك ، سجل عملية التكوين الخاصة بك والمشاكل التي واجهتها لتسهيل العملية التالية. آمل أيضًا مساعدة بعض الأصدقاء.
1. استخدم آلية اعتراض AOP الربيع لتحقيق الانتقاء الديناميكي لمصادر البيانات.
استيراد java.lang.annotation.elementType ؛ استيراد java.lang.annotation.target ؛ استيراد java.lang.annotation.Reentering ؛ استيراد java.lang.annotation.RetentionPolicy ؛ /** * وقت التشغيل * سيقوم برنامج التحويل البرمجي بتسجيل التعليقات في ملف الفصل ، وسيحتفظ VM بالتعليقات في وقت التشغيل ، بحيث يمكن قراءتها بشكل عكسي. * Author yangguang * */ retention (attreentionpolicy.runtime) target (elementType.method) public interface datasource {string value () ؛ } 3. استخدم AbstRactRactRoutingDataSource من Spring لحل مشكلة مصادر البيانات المتعددة
استيراد org.springframework.jdbc.datasource.lookup.abstractroutingdataSource ؛ يمتد الفئة العامة choosedAtaSource abstractroutingdataSource {Override كائن محمي DETERNECURRENTOKTOPKEUPKEY () {return handledatasource.getDataSource () ؛ }} 4. استخدم ThreadLocal لحل مشاكل سلامة الخيط
الفئة العامة handledataSource {public static final threadlocal <string> حامل = new threadlocal <string> () ؛ putDataSource باطل ثابت عام (سلسلة بيانات) {holder.set (dataSource) ؛ } سلسلة ثابتة عامة getDataSource () {return Holder.get () ؛ }}5. تحديد فئة Facet Source Source ، التي يتم الوصول إليها من خلال AOP ، ويتم تكوينها في ملف تكوين الربيع ، لذلك لا يتم استخدام شرح AOP.
استيراد java.lang.reflect.method ؛ استيراد org.aspectj.lang.joinpoint ؛ استيراد org.aspectj.lang.annotation.Aspect ؛ استيراد org.aspectj.lang.annotation.before ؛ استيراد org.aspectj.lang.annotation.pointCut ؛ استيراد org.aspectj.lang.reflect.MethodSignature ؛ استيراد org.springframework.stereotype.component ؛ //@side //@component public class dataSourCeaspect {//@pointcut ("التنفيذ (*com.apc.cms.service.*. // before (value = "pointcut ()") public void قبل (نقطة Joinpoint) {object target = point.getTarget () ؛ System.out.println (Target.ToString ()) ؛ طريقة السلسلة = point.getSignature (). getName () ؛ system.out.println (method) ؛ الفئة <؟> [] classz = target.getClass (). getInterFaces () ؛ class <؟> [] parametertypes = ((MaysIngureature) point.getSignature ()) .getMethod (). getParameterTypes () ؛ حاول {method m = classz [0] .getMethod (method ، parametertypes) ؛ system.out.println (m.getName ()) ؛ if (m! = null && m.iSannotationPresent (dataSource.Class)) {dataSource data = m.getAnnotation (datasource.class) ؛ handledatasource.putdatasource (data.value ()) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }}}6. تكوين ApplicationContext.xml
<!-مصدر بيانات المكتبة الرئيسي-> <bean id = "writedatasource" تدمير method = "close"> <property name = "driverclass" value = "com.mysql.jdbc.driver"/> <property name = "jdbcurl" value = "jdbc: mysql: //172.22.14.6: 3306/ name = "username" value = "root"/> <property name = "password" value = "root"/> <property name = "partitionCount" value = "4"/> <property name = "relextHelperThreads name = "minconnectionsperpartition" value = "20"/> <property name = "idlemaxageinseconds" value = "60"/> <property name = "idleConnecteTestPeriodinseconds" value = "60"/> <property name = "poolavialthold" value = "5"/>!- تدمير method = "close"> <property name = "driverclass" value = "com.mysql.jdbc.driver"/> <property name = "jdbcurl" value = "jdbc: mysql: //172.22.14.7: 3306/cPP؟ value = "root"/> <property name = "partitionCount" value = "4"/> <property name = "regleperTherThReads" value = "3"/> <property name = "caugierIncrement" value = "2"/> <property name = "maxConnectionSpartition" value = "40"/> <propert name = "idlemaxageinseconds" value = "60"/> <property name = "idleConnecteTestPeriodiNseconds" value = "60"/> <property name = "poolavailableThold" value = "5"/> </bean> <! </bean> <!-تحميل التعليقات التوضيحية-> <السياق: التعليق التوضيحي-config /> <!-مسح مكون enale (حذار أن هذا لا يمكّن المسح الضوئي!)-> <context: component-scan package = "com.apc.cms.persistence.rdbms" /> <السياق: قم بتضمين نوع المرشح = "التعليق التوضيحي" التعبير = "org.springframework.stereType.component" /> < /سياق: مكون-المستحضر> <سياق: مكون المستحضر الأساسي = tx: "innotation-" sqlsessionfactory-> <bean id = "sqlsessionfactory"> <property name = "datasource" ref = "datasource" /> <property name = "typealiasespackage" value = "com.apc.cms.model.domain" /> < /bean> <! value = "com.apc.cms.persistence" /> <property name = "sqlSessionFactory" ref = "sqlsessionfactory" /> </bean> <bean id = "dataSource"> <property name = "targetdatasources"> <map-type = "java.lang.string" value-ref = "writedataSource"/> <!-read-> <interpt key = "read" value-ref = "readDataSource"/> </map> </propert proxy-t-arget-class = "true"/> <!-تكوين شرح قاعدة البيانات AOP-> <bean id = "datasourceaspect"/> <aop: config> <aop: appleted id = "c" ref = "dataSourCeaspect"> <aop: pointcut id = "tx" expression = "exember pointcut-ref = "tx" method = "re"/> </aop: side> </aop: config> <!-تكوين شرح قاعدة البيانات aop->
7. استخدم التعليقات التوضيحية لتحديد مصدر البيانات ديناميكيًا ، وقراءة المكتبة وكتابة المكتبة على التوالي.
datasource ("الكتابة") تحديث باطل عام (مستخدم المستخدم) {usermapper.update (user) ؛ } dataSource ("read") وثيقة عامة getDocbyId (معرف طويل) {return documentMapper.getById (id) ؛ } اختبار الكتابة: يمكنك تعديل البيانات من خلال التطبيق وتعديل بيانات المكتبة الرئيسية. ستجد أنه تم تحديث البيانات الموجودة في مكتبة الرقيق بشكل متزامن ، وبالتالي فإن عمليات الكتابة المحددة كلها مكتوبة في المكتبة.
اختبار عملية القراءة: تعديل بيانات قاعدة بيانات الرقيق في الخلفية ، تحقق من أن البيانات الموجودة في قاعدة البيانات الرئيسية لم يتم تعديلها ، وتحديثها على صفحة التطبيق ، وابحث عن قراءة البيانات الموجودة في قاعدة بيانات الرقيق ، مما يعني أن فصل القراءة والكتابة على ما يرام.
ملخص للمشاكل التي تمت مواجهتها:
السؤال 1: المشروع هو مشروع Maven ، ويتم استخدام آلية AOP الربيع. بالإضافة إلى حزم الجرة الأساسية في الربيع ، فإن حزم الجرة التي يجب استخدامها هي SideJ.Jar و SidejWeaver.jar و Aopalliance.jar. تحقق من POM في المشروع ووجد أن حزمة التبعية مفقودة. نظرًا لأن المستودع المحلي لا يحتوي على هذه الجرار ، فابحث عن مكتبة Maven Central التي يمكنها توفير تنزيل حزمة JAR ، وتكوينها في Maven ، والتحديث تلقائيًا:
<Restository> <id> nexus </d> <ame> nexus </mame> <Url> http://repository.sonatype.org/content/groups/public/ </url> <rayout> الافتراضي </layout> </ropository>
الجرار التي تعتمد على تكوين المشروع تفتقد بشكل أساسي هذين.
<Rependency> <roupency> sideidj </rougiD> <StifactId> sidejrt </shintifactid> <soph> 1.5.4 </splements> </sependency> <seperency> <roupiD> sidefj </rougeid> <StifactId> sidejweaver </artifactid>
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.