1. คำนำ
กลยุทธ์การแยกและการเขียนของฐานข้อมูลในสภาพแวดล้อมแบบกระจายเป็นโซลูชันหลักในการแก้ปัญหาคอขวดของฐานข้อมูลการอ่านและเขียนประสิทธิภาพและยังช่วยเพิ่มความเร็วและข้อมูลพร้อมกันของข้อมูลการอ่าน (อ่าน) ในแอปพลิเคชัน
เมื่อแยกการอ่านและเขียนฐานข้อมูลก่อนอื่นเราต้องกำหนดค่าหลักฐานข้อมูลและทาส สิ่งที่ง่ายที่สุดคืออาจารย์และทาส (สำหรับระบบเว็บไซต์ขนาดใหญ่แน่นอนว่ามันจะซับซ้อนมากที่นี่เราเพิ่งวิเคราะห์สถานการณ์ที่ง่ายที่สุด) ผ่านการกำหนดค่าหลัก-สลาฟฐานข้อมูลหลักสลาฟเก็บข้อมูลเดียวกัน เราเข้าถึง Slave Database Slave เมื่อดำเนินการอ่านและ Master Database Master เมื่อดำเนินการเขียน สิ่งนี้จะลดแรงกดดันบนเซิร์ฟเวอร์
เมื่อทำการวิเคราะห์กรณีการอ่านและเขียน ขั้นแรกให้กำหนดค่าการจำลองแบบสลาฟมาสเตอร์ของฐานข้อมูลและให้คำอธิบายโดยละเอียดเกี่ยวกับการติดตั้งแบบซิงโครนัสและการกำหนดค่าของฐานข้อมูล MASTABASE Master-Slave (Master/Slave) ฐานข้อมูล MySQL5.6 (Master/Slave)
แน่นอนว่ามันเป็นเพียงวิธีง่ายๆในการดูวิธีการใช้รหัสเพื่อให้ได้การแยกฐานข้อมูลอ่านและเขียนและไม่จำเป็นต้องกำหนดค่าฐานข้อมูลหลักและทาส ต้องการเพียงสองเครื่องที่ติดตั้งฐานข้อมูลเดียวกัน
2. สองวิธีในการบรรลุการอ่านและการเขียนแยก
โดยเฉพาะในการพัฒนามีสองวิธีทั่วไปในการบรรลุการอ่านและการเขียนการแยก:
1. วิธีแรกเป็นวิธีที่ใช้กันมากที่สุดซึ่งคือการกำหนดการเชื่อมต่อฐานข้อมูลสองครั้งหนึ่งคือ MasterDataSource และอื่น ๆ คือ SlavedataSource เมื่ออัปเดตข้อมูลเราจะอ่าน MasterDataSource และเมื่อสอบถามข้อมูลเราจะอ่าน SlavedataSource วิธีนี้ง่ายมากดังนั้นฉันจะไม่เข้าไปดูรายละเอียด
2. วิธีที่สองของการสลับแหล่งข้อมูลแบบไดนามิกคือการสานแหล่งข้อมูลลงในโปรแกรมเมื่อโปรแกรมกำลังทำงานเพื่อเลือกที่จะอ่านไลบรารีหลักหรือไลบรารีทาส เทคโนโลยีหลักที่ใช้คือ: คำอธิบายประกอบ, สปริง AOP, การสะท้อน
วิธีการใช้งานจะอธิบายในรายละเอียดด้านล่าง
3. AOP ตระหนักถึงกรณีการอ่านและการเขียนของฐานข้อมูล Master-Slave
1. ที่อยู่รหัสโครงการ
ที่อยู่โครงการปัจจุบันของการสาธิตนี้: การสาธิต
2. โครงสร้างโครงการ
ในรูปด้านบนนอกเหนือจากรหัสที่ทำเครื่องหมายไว้แล้วรหัสอื่น ๆ ส่วนใหญ่เป็นรหัสการกำหนดค่าและรหัสธุรกิจ
3. การวิเคราะห์เฉพาะ
โครงการนี้เป็นตัวอย่างของ SSM Framework, Spring, Spring MVC และ MyBatis ไฟล์การกำหนดค่าที่เฉพาะเจาะจงไม่ได้แนะนำมากเกินไป
(1) UserContoller จำลองการอ่านและการเขียนข้อมูล
/*** สร้างโดย Xuliugen เมื่อปี 2016/5/4 */@controller@requestmapping (value = "/user", ผลิต = {"แอปพลิเคชัน/json; charset = utf-8"}) คลาสสาธารณะ userController {@Inject ส่วนตัว iUserservice ผู้ใช้บริการ; //http://localhost:8080/user/select.do @ResponseBody @RequestMapping (value = "/select.do", method = requestMethod.get) สตริงสาธารณะเลือก () {ผู้ใช้ผู้ใช้ = ผู้ใช้ return user.toString (); } //http://localhost:8080/user/add.do @responsebody @requestmapping (value = "/add.do", method = requestmethod.get) สตริงสาธารณะเพิ่ม () {boolean isok = userservice.adduser return isok == true? "Shibai": "Chenggong"; -จำลองการอ่านและการเขียนข้อมูลและโทรหา iuserService
(2) Spring-db.xml อ่านและเขียนการกำหนดค่าแหล่งข้อมูล
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org/2001/xml xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://ww.springframework id = "statFilter" lazy-init = "true"> <property name = "logslowsql" value = "true"/> <property name = "MergesQl" value = "true"/> </ebean> <! value = "$ {driver}"/> <property name = "url" value = "$ {url1}"/> <property name = "username" value = "root"/> <ชื่อคุณสมบัติ = "รหัสผ่าน" value = "$}"/> <! lazy-init = "true"> <property name = "driverclassName" value = "$ {driver}"/> <property name = "url" value = "$ {url}"/> <property name = "username" value = "root"/> <property name = "รหัสผ่าน" -> <bean id = "dataSource" lazy-init = "true"> <property name = "targetDataSources"> <แผนที่ key-type = "java.lang.string" value-type = "javax.sql.datasource"> <! value-ref = "readDataSource"/> </perty> </property> <property name = "defaultTargetDataSource" ref = "writeDataSource"/> <property name = "methodType"> <แผนที่ key-type = "java.lang.string"> <! <entry key = "write" value = ", เพิ่ม, สร้าง, อัปเดต, ลบ, ลบ,"/> </map> </property> </ebean> </ebeans>ในการกำหนดค่าข้างต้น ReadDataSource และ WriteDataSource ได้รับการกำหนดค่า แต่เฉพาะแหล่งข้อมูลเท่านั้นที่ส่งมอบให้กับ SQLSessionFactoryBean สำหรับการจัดการและการใช้งาน: com.xuliugen.choocedb.demo.aspect.choosedataSource ใช้การเลือกฐานข้อมูล
<property name = "MethodType"> <แผนที่ key-type = "java.lang.string"> <!-อ่าน-> <entry key = "read" value = ", get, select, count, count, list, query"/> <!
คำหลักคำนำหน้าเฉพาะฐานข้อมูลได้รับการกำหนดค่า รหัสเฉพาะของ Choosedatasource มีดังนี้:
(3) choososedatasource
/*** รับแหล่งข้อมูลที่ใช้ในการสลับแหล่งข้อมูลแบบไดนามิก*/คลาสสาธารณะ ChooscedAtAsource ขยาย AbsTractroutingDataSource {แผนที่สาธารณะคงที่ <String, รายการ <String>> Method_type_map = new HashMap <String, รายการ <String >> (); / *** ใช้วิธีการนามธรรมในคลาสพาเรนต์และรับชื่อแหล่งข้อมูล* @return*/ วัตถุที่ได้รับการป้องกันการกำหนดค่าความน่าสนใจ () {ส่งคืน dataSourceHandler.getDataSource (); } // ตั้งค่าแหล่งข้อมูลที่สอดคล้องกับชื่อเมธอด prefix โมฆะสาธารณะ setMethodtype (แผนที่ <สตริงสตริง> แผนที่) {สำหรับ (คีย์สตริง: map.keyset ()) {รายการ <string> v = new ArrayList <String> (); String [] types = map.get (key) .split (","); สำหรับ (ประเภทสตริง: ประเภท) {ถ้า (stringutils.isnotblank (ประเภท)) {v.add (ประเภท); }} method_type_map.put (คีย์, v); -(4) DataSourceAspect ดำเนินการ AOP Intercept สำหรับวิธีการเฉพาะ
/** * สวิตช์แหล่งข้อมูล (วิธีการต่าง ๆ เรียกแหล่งข้อมูลที่แตกต่างกัน) */@ASPACT@Component@enableaspectJautoproxy (proxytargetClass = true) คลาสสาธารณะคลาส DataSourceaspect @PointCut ("Execution (*com.xuliugen.choosedb.demo.mybatis.dao.*.*(.. ))") โมฆะสาธารณะ () {} / ***กำหนดค่าการแจ้งเตือนล่วงหน้า point.getTarget (). getClass (). getName (); วิธีการสตริง = point.getSignature (). getName (); logger.info (classname + "." + method + "(" + stringutils.join (point.getargs (), ",") + ")"); ลอง {สำหรับ (คีย์สตริง: choososedataSource.method_type_map.keyset ()) {สำหรับ (ประเภทสตริง: choososedatasource.method_type_map.get (คีย์)) {ถ้า (method.startswith }}}} catch (Exception E) {E.printStackTrace (); -(5) DataSourceHandler คลาส Handler ของแหล่งข้อมูล
แพ็คเกจ com.xuliugen.choosedb.demo.aspect;/*** คลาส handler ของแหล่งข้อมูล*/คลาสสาธารณะ dataSourceHandler {// ชื่อแหล่งข้อมูลชื่อดข้อมูล public public public final threadLocal <String> Holder = ใหม่ ThreadLocal <String> (); / *** เพิ่มแหล่งข้อมูลการอ่านและเขียนที่กำหนดค่าไว้ในตัวยึดเมื่อโครงการเริ่มต้น*/ โมฆะสาธารณะคงที่ putdataSource (สตริง DataSource) {holder.set (DataSource); } / *** รับสตริงแหล่งข้อมูลจาก Holer* / Public Static String getDataSource () {return holder.get (); - รหัสหลักตามที่กล่าวไว้ข้างต้น
รหัสในบทความนี้: สาธิต
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น