Spring AOP การกำหนดค่า MySQL Master-Slave ตระหนักถึงการแยกการอ่านและเขียน จากนั้นบันทึกกระบวนการกำหนดค่าและปัญหาของคุณเองเพื่ออำนวยความสะดวกในการดำเนินการครั้งต่อไป ฉันหวังว่าจะได้ช่วยเหลือเพื่อนบางคน
1. ใช้กลไกการสกัดกั้นสปริง AOP เพื่อตระหนักถึงการเลือกแหล่งข้อมูลแบบไดนามิก
นำเข้า java.lang.annotation.ElementType; นำเข้า java.lang.annotation.target; นำเข้า java.lang.annotation.retention; นำเข้า java.lang.annotation.RetentionPolicy; /** * รันไทม์ * คอมไพเลอร์จะบันทึกความคิดเห็นในไฟล์คลาสและ VM จะเก็บความคิดเห็นไว้ที่รันไทม์ดังนั้นจึงสามารถอ่านได้ * @author Yangguang * */ @retention (RetentionPolicy.runtime) @Target (ElementType.Method) Public @Interface DataSource {ค่าสตริง (); - 3. ใช้ abstractroutingDataSource ของ Spring เพื่อแก้ปัญหาแหล่งข้อมูลหลายแหล่ง
นำเข้า org.springframework.jdbc.datasource.lookup.abstractroutingDatasource; ชั้นเรียนสาธารณะ ChooscedAtaSource ขยาย AbstractroutingDataSource {@Override วัตถุที่ได้รับการป้องกันการกำหนดค่าความน่าสนใจ () {return handleDataSource.getDataSource (); - 4. ใช้ Threadlocal เพื่อแก้ปัญหาความปลอดภัยของด้าย
Public Class HandleDataSource {สาธารณะคงที่ threadLocal <String> holder = new ThreadLocal <String> (); โมฆะสาธารณะคงที่ putDataSource (สตริง dataSource) {holder.set (DataSource); } สตริงคงที่สาธารณะ getDataSource () {return holder.get (); -5. กำหนดคลาส Facet Source Data เข้าถึงผ่าน 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; //@ASPASS //@Component Public Class DataSourceAspect {//@pointcut ("การดำเนินการ (*com.apc.cms.service.*.*(.. ))") โมฆะสาธารณะ Pointcut () {}; // @before (value = "pointcut ()") โมฆะสาธารณะก่อน (จุดเข้าร่วม) {วัตถุเป้าหมาย = point.getTarget (); System.out.println (target.toString ()); วิธีการสตริง = point.getSignature (). getName (); System.out.println (วิธีการ); คลาส <?> [] classz = target.getClass (). getInterfaces (); คลาส <?> [] parameterTypes = ((methodSignature) point.getSignature ()) .getMethod (). getParameterTypes (); ลอง {method m = classz [0] .getMethod (วิธีการพารามิเตอร์ parameterTypes); System.out.println (M.GetName ()); if (m! = null && m.isannotationpresent (dataSource.class)) {dataSource data = m.getAnnotation (dataSource.class); handleDataSource.putDataSource (data.value ()); }} catch (exception e) {e.printstacktrace (); -6. กำหนดค่า ApplicationContext.xml
<!-แหล่งข้อมูลห้องสมุดหลัก-> <bean id = "writedataSource" destroy-method = "close"> <property name = "driverclass" value = "com.mysql.jdbc.driver"/> <property name = "jdbcurl" value = "jdbc: mysql: //172.22.2. <property name = "ชื่อผู้ใช้" value = "root"/> <property name = "password" value = "root"/> <property name = "partitionCount" value = "4"/> <property name = "releaseHelperThreads" value = "3"/> <property name = "value name = "minconnectionsperpartition" value = "20"/> <property name = "idleMaxageInseconds" value = "60"/> <property name = "IdleConnectionTestPeriodinseconds" value = "60"/> Destroy-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 = "พาร์ติชั่น" value = "4"/> <property name = "releaseHelperThreads" value = "3"/> <property name = "AcquireIncrement" value = "2"/> <property name = "maxConnectionsPartition" value = "40"/> < name = "idleMaxageInseconds" value = "60"/> <property name = "IdleConnectionTestPeriodIndinseconds" value = "60"/> <property name = "poolavailabilitythreshold" value = "5"/> </epean> <! </ebean> <!-การเพิ่มความคิดเห็น-การโหลด-> <บริบท: คำอธิบายประกอบ-config /> <!-การสแกนส่วนประกอบ enale (ระวังว่าสิ่งนี้ไม่ได้เปิดใช้งานการสแกน mapper!)-> <บริบท: Component-scan base-package = "com.apc.cms.persistence.rdbms" /> <บริบท: รวมตัวกรองประเภท = "คำอธิบายประกอบ" นิพจน์ = "org.springframework.steretype.Component" /> < /บริบท: Component-Scan> <บริบท: Component-Scan base-package = "com.apc.cms.auth" /> <! <bean id = "sqlsessionfactory"> <property name = "dataSource" ref = "dataSource" /> <property name = "typealiasEspackage" value = "com.apc.cms.model.domain" /> </epacage /> <property name = "sqlsessionfactory" ref = "sqlsessionfactory" /> </ebean> <bean id = "dataSource"> <property name = "targetDataSources"> <แผนที่ key-type = "java.lang.string"> <! key = "read" value-ref = "ReadDataSource"/> </map> </คุณสมบัติ> <property name = "defaultTargetDataSource" ref = "writedataSource"/> </ebean> <! <bean id = "dataSourceAspect"/> <aop: config> <aop: ispact id = "c" ref = "dataSourceAspect"> <aop: pointcut id = "tx" expression = "Execution (com.apc.cms.service ..*.*.*(.. ) </aop: config> <!-กำหนดค่าคำอธิบายประกอบฐานข้อมูล AOP->
7. ใช้คำอธิบายประกอบเพื่อเลือกแหล่งข้อมูลแบบไดนามิกและอ่านไลบรารีและเขียนไลบรารีตามลำดับ
@datasource ("เขียน") การอัปเดตโมฆะสาธารณะ (ผู้ใช้ผู้ใช้) {usermapper.update (ผู้ใช้); } @datasource ("อ่าน") เอกสารสาธารณะ getDocById (Long ID) {ส่งคืน DocumentMapper.getById (ID); - ทดสอบการเขียนการเขียน: คุณสามารถแก้ไขข้อมูลผ่านแอปพลิเคชันและแก้ไขข้อมูลไลบรารีหลัก คุณจะพบว่าข้อมูลในไลบรารีทาสได้รับการอัปเดตแบบซิงโครนัสดังนั้นการดำเนินการเขียนที่กำหนดไว้ทั้งหมดเขียนไว้ในห้องสมุด
การทดสอบการอ่านการอ่าน: แก้ไขข้อมูลฐานข้อมูลทาสในพื้นหลังตรวจสอบว่าข้อมูลในฐานข้อมูลหลักยังไม่ได้รับการแก้ไขรีเฟรชบนหน้าแอปพลิเคชันและพบว่าข้อมูลในฐานข้อมูลทาสนั้นอ่านซึ่งหมายความว่าการอ่านและการเขียน
สรุปปัญหาที่พบ:
คำถามที่ 1: โครงการเป็นโครงการ Maven และใช้กลไก AOP ในฤดูใบไม้ผลิ นอกเหนือจากแพ็คเกจ Jar Core ของฤดูใบไม้ผลิแพ็คเกจ Jar ที่ต้องใช้คือ Aspectj.jar, Appistjweaver.jar และ aopalliance.jar ตรวจสอบ POM ในโครงการและพบว่าแพ็คเกจการพึ่งพาหายไป เนื่องจากพื้นที่เก็บข้อมูลในท้องถิ่นไม่มีขวดเหล่านี้มองหาห้องสมุดกลาง Maven ที่สามารถให้การดาวน์โหลดแพ็คเกจ JAR กำหนดค่าใน Maven และอัปเดตโดยอัตโนมัติ: โดยอัตโนมัติ:
<repository> <id> nexus </id> <name> nexus </name> <url> http://repository.sonatype.org/content/groups/public/ </url>
ขวดที่ขึ้นอยู่กับการกำหนดค่าโครงการส่วนใหญ่จะหายไปทั้งสองนี้
<predency> <sdeperency> <spective appectj </groupid> <ratifactid> spectionjrt </artifactid> <cersion> 1.5.4 </เวอร์ชั่น> </การพึ่งพาอาศัยกัน> <predency> <sderncy> <sdependency>
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น