MyBatis Multi-Data Source Configuration (การแยกอ่าน-เขียน)
ก่อนอื่นวิธีที่ตรงที่สุดในการใช้การกำหนดค่าในบทความนี้อาจเป็นเรื่องยากมากที่จะใช้งานจริง
อาจมีหลายชุดค่าผสมในแอปพลิเคชันจริง คุณสามารถเข้าใจความหมายของบทความนี้และอย่าใช้อย่างเข้มงวด
สถานการณ์ที่เป็นไปได้ด้วยแหล่งข้อมูลหลายแหล่ง
1. อาจารย์และทาส
โดยปกติแล้วเป็นกรณีที่ MySQL มีอาจารย์หนึ่งคนและทาสหลายคน ตัวอย่างในบทความนี้เป็นกรณีที่ต้นแบบและทาสอยู่ แต่มีเพียงสองแหล่งข้อมูลดังนั้นจึงไม่ลำบากเกินไปที่จะใช้การกำหนดค่าโดยตรง แต่ไม่เอื้อต่อการขยายตัวครั้งต่อไป ส่วนใหญ่จะใช้เป็นตัวอย่างในการแสดง โปรดพิจารณาอย่างรอบคอบในการดำเนินการจริง
2. หารห้องสมุด
เมื่อความเป็นอิสระทางธุรกิจมีความแข็งแกร่งและปริมาณข้อมูลมีขนาดใหญ่เพื่อปรับปรุงการเกิดขึ้นพร้อมกันตารางอาจถูกแบ่งออก หลังจากแบ่งฐานข้อมูลแต่ละฐานข้อมูลจำเป็นต้องกำหนดค่าแหล่งข้อมูล
ในกรณีนี้คุณสามารถอ้างถึงบทความนี้ได้ แต่จำเป็นต้องทราบว่า mapper ที่สอดคล้องกับฐานข้อมูลแต่ละฐานควรมีความโดดเด่นและกำหนดค่าภายใต้แพ็คเกจที่แตกต่างกัน
นอกจากนี้เมื่อมีพาร์ติชันฐานข้อมูลจะมีกรณีหลัก หากคุณมีห้องสมุดทาสฐานข้อมูลมากเกินไปโปรดดูวิธีการที่มีให้ข้างต้นหรือค้นหาวิธีอื่น ๆ ในการแก้ปัญหา
ผู้รับเหมาช่วง Mapper
ในกรณีของการแบ่งพาร์ติชันการแมปของฐานข้อมูลต่าง ๆ จะต้องอยู่ภายใต้แพ็คเกจที่แตกต่างกัน
ในกรณีของ Master และ Slave Mapper เดียวกันจะถูกอ่านและเขียนในเวลาเดียวกัน ไม่เหมาะสมที่จะสร้างสองเพียงแค่ใช้สิ่งเดียวกัน อย่างไรก็ตามในกรณีนี้มีความจำเป็นที่จะต้องทราบว่าสปริงจะสร้างชื่อของ Mapper โดยอัตโนมัติและประเภทนั้นเหมือนกันดังนั้นจึงไม่สามารถฉีดลงในอินเทอร์เฟซ Mapper ได้โดยตรง มันจะต้องได้รับการแก้ไขผ่าน SQLSession
การกำหนดค่าพื้นฐานของฤดูใบไม้ผลิ
ApplicationContext.xml
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <บริบท: Component-scan base-package =" com.isea533 location = "classpath: config.properties"/> <aop: appectj-autoproxy/> <import resource = "spring-datasource-master.xml"/> <import Resource = "Spring-Datasource-slave.xml"/>
ไฟล์นี้ส่วนใหญ่แนะนำ Spring-Datasource-master.xml และ Spring-Datasource-slave.xml
Spring-Datasource-master.xml
<ถั่ว xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http:/ http://www.springframework.org/schema/beans/spring-beans.XSD http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.a Destroy-method = "close"> <property name = "driverclassName" value = "$ {master.jdbc.driverclass}"/> <property name = "url" value = "$ {master.jdbc.url}"/> <property name = "username" value = "$ {master.jdbc.user} value = "$ {master.jdbc.password}"/> <property name = "filters" value = "stat"/> <property name = "maxactive" value = "20"/> <ชื่อคุณสมบัติ = "ค่าเริ่มต้น" value = "1"/> value = "60000"/> <property name = "minevictableidletEtimeLis" value = "300000"/> <property name = "validationQuery" value = "เลือก 'x'"/> <property name = "testharileDle" value = "true"/> id = "sqlsessionfactory1"> <property name = "dataSource" ref = "dataSourceMaster"/> <property name = "mapperlocations"> <rray> <value> classpath: mapper/*. xml </value> </array> value = "com.isea533.mybatis.mapper"/> <property name = "sqlsessionfactorybeanname" value = "sqlsessionfactory1"/> </ebean> <bean id = "sqlsessionMaster" <aop: config> <aop: pointcut id = "appservice" expression = "การดำเนินการ (*com.isea533.MyBatis.Service ..*บริการ*.*(.. ))"/> <aop: คำแนะนำที่ปรึกษา-ref = "txadvice1" pointcut-ref = "appservice"/> Transaction-Manager = "TransactionManager1"> <tx: แอตทริบิวต์> <tx: method name = "select*" read-only = "true"/> <tx: method name = "find*" read-only = "true"/> <tx: method = "get*" read-only = "true"/> <tx </tx: แอตทริบิวต์> </tx: คำแนะนำ> <bean id = "transactionManager1"> <property name = "dataSource" ref = "dataSourceMaster"/> </ebean>Spring-Datasource-slave.xml
มีความแตกต่างกันเล็กน้อยระหว่างมันกับต้นแบบส่วนใหญ่เป็นเพราะมีความแตกต่างระหว่างชื่อ ID และการกำหนดค่าแหล่งข้อมูล
<ถั่ว xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http:/ http://www.springframework.org/schema/beans/spring-beans.XSD http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.a Destroy-Method = "Close"> <property name = "driverclassName" value = "$ {slave.jdbc.driverclass}"/> <property name = "url" value = "$ {slave.jdbc.url}"/<property name = "username" value = "$ {slave.jdbc.user} value = "$ {slave.jdbc.password}"/> <property name = "filters" value = "stat"/> <property name = "maxactive" value = "20"/> <property name = "imitiesize" value = "1"/> <property name = "maxWait" value = "60000"/> < name = "timebetweenevictionrunsmillis" value = "60000"/> <property name = "minevictableidletimeLis" value = "300000"/> <name property = "validationQuery" value = "select 'x'"/> <property name = "testhareidle" value = "true"/> < value = "false"/> </ebean> <bean id = "sqlsessionfactory2"> <property name = "dataSource" ref = "dataSourceslave"/> <property name = "mapperlocations"> <rray> value = "com.isea533.mybatis.mapper"/> <property name = "sqlsessionfactorybeanname" value = "sqlsessionfactory2"/> </ebean> <bean id = "sqlsessionslave" scope = "Prototype <aop: config> <aop: pointcut id = "appservice" expression = "การดำเนินการ (*com.isea533.mybatis.service ..*บริการ*.*(.. ))"/> <aop: คำแนะนำที่ปรึกษา-ref = "txadvice2" pointcut-ref = "appservice"/> Transaction-Manager = "TransactionManager2"> <tx: แอตทริบิวต์> <tx: method name = "*" read-only = "true"/> </tx: แอตทริบิวต์> </tx: คำแนะนำ> <bean id = "transactionManager2">ควรสังเกตที่นี่ว่า <tx: method name = "*" read-only = "true"/> เป็นการอ่านอย่างเดียว หากไม่ใช่ไลบรารีทาสคุณสามารถกำหนดค่าตามห้องสมุดหลัก
ในรหัสต่อไปนี้:
<bean> <property name = "basepackage" value = "com.isea533.mybatis.mapper"/> <property name = "sqlsessionfactorybeanname" value = "sqlsessionfactory2"/> </epean>
ต้องระบุ SQLSessionFactory ที่แตกต่างกันผ่าน SQLSessionFactoryBeanName
config.properties
# ฐานข้อมูลการกำหนดค่า - mastermaster.jdbc.driverclass = com.mysql.jdbc.driverermaster.jdbc.url = jdbc: mysql: //192.168.1.11: 3306/testmaster.jdbc.user = rootmaster.jdbc. com.mysql.jdbc.driverslave.jdbc.url = jdbc: mysql: //192.168.1.22: 3306/testslave.jdbc.user = rootslave.jdbc.password = jj
ใช้ Mapper
นี่คือการตั้งค่าสำหรับสถานการณ์นายและทาส แมปสแกนการตั้งค่าทั้งสองนั้นเหมือนกันดังนั้นจึงไม่สามารถฉีดได้โดยตรงดังนั้นพวกเขาจึงต้องถูกฉีดผ่านวิธีการลำบากด้านล่าง
@ServicePublic Demoservice {Private CountryMapper writemapper; Private CountryMapper READMAPPER; @Resource (name = "SQLSessionMaster") โมฆะสาธารณะ setWriteMapper (SQLSession SQLSession) {this.writemapper = sqlsession.getMapper (CountryMapper.class); } @Resource (name = "SQLSessionsLave") โมฆะสาธารณะ setReadMapper (SQLSession SQLSession) {this.readMapper = sqlsession.getMapper (CountryMapper.class); } Public Int Save (ประเทศประเทศ) {return writemapper.insert (ประเทศ); } รายการสาธารณะ <ประเทศ> selectPage (int pagenum, หน้า int) {pageHelper.startPage (pagenum, pageSize); return readmapper.select (null); -เนื่องจาก SQLSession สามารถแยกแยะได้ด้วยชื่อเราจึงได้รับ MAPPER จาก SQLSESSION
นอกจากนี้หากคุณต้องการพิจารณาเมื่อเขียนและอ่านในธุรกรรมเดียวกันคุณต้องใช้ writemapper เดียวกันเพื่อให้ข้อมูลล่าสุดในการทำธุรกรรมสามารถรับได้เมื่ออ่าน
ข้างต้นเป็นสถานการณ์ของอาจารย์และทาส
ในกรณีของพาร์ติชันห้องสมุดเนื่องจากตัวแมปที่แตกต่างกันอยู่ภายใต้แพ็คเกจที่แตกต่างกันคุณสามารถฉีด Mapper โดยตรงโดยใช้ @Resource หรือ @Autowired และไม่จำเป็นต้องได้รับผ่าน SQLSession
บทความนี้เป็นเพียงการอ้างอิงสำหรับแหล่งข้อมูลหลายแหล่ง โปรดพิจารณาตามสถานการณ์ของคุณเองเมื่อสมัครในทางปฏิบัติ
ในอนาคตฉันจะใช้เวลาว่างเพื่อพยายามพัฒนาปลั๊กอินที่สามารถสลับแหล่งข้อมูลโดยอัตโนมัติตามบทความนี้และลิงก์ที่เกี่ยวข้องสองลิงก์ด้านบนไปยังแหล่งข้อมูลหลายแหล่ง MySQL เนื่องจากฉันไม่คุ้นเคยกับแอปพลิเคชันที่ใช้งานได้จริงในพื้นที่นี้ฉันยินดีต้อนรับทุกคนที่จะฝากข้อความเพื่อแบ่งปันวิธีแก้ปัญหาของตัวเอง ยิ่งฉันรู้เกี่ยวกับสิ่งเหล่านี้มากเท่าไหร่ก็ยิ่งมีโอกาสมากขึ้นในการพัฒนาปลั๊กอินการสลับแหล่งข้อมูลทั่วไป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น