Konfigurasi Sumber Multibatis Multi-Data (Pemisahan Baca-Write)
Pertama -tama, cara paling langsung untuk menggunakan konfigurasi dalam artikel ini mungkin sangat merepotkan untuk benar -benar digunakan.
Mungkin ada beberapa kombinasi dalam aplikasi aktual. Anda dapat memahami arti artikel ini dan tidak menggunakannya dengan kaku.
Situasi yang mungkin dengan beberapa sumber data
1. Guru dan budak
Biasanya, itu adalah kasus di mana MySQL memiliki satu master dan banyak budak. Contoh dalam artikel ini adalah kasus di mana master dan budak berada, tetapi hanya ada dua sumber data, jadi tidak terlalu merepotkan untuk menggunakan konfigurasi langsung, tetapi tidak kondusif untuk ekspansi berikutnya. Ini terutama digunakan sebagai contoh untuk diilustrasikan. Harap pertimbangkan dengan cermat dalam operasi yang sebenarnya.
2. Membagi Perpustakaan
Ketika kemandirian bisnis kuat dan volume data besar, untuk meningkatkan konkurensi, tabel dapat dibagi. Setelah database dibagi, setiap database perlu mengkonfigurasi sumber data.
Dalam hal ini, Anda dapat merujuk pada artikel ini, tetapi perlu dicatat bahwa mapper yang sesuai dengan setiap database harus dibedakan dan dikonfigurasi dengan mudah di bawah paket yang berbeda.
Selain itu, ketika ada partisi basis data, akan ada kasus master-slave. Jika Anda memiliki terlalu banyak pustaka slave basis data, silakan merujuk metode yang disediakan di atas, atau menemukan cara lain untuk menyelesaikan masalah.
Subkontrak mapper
Dalam kasus partisi, pemetaan dari berbagai basis data harus ditempatkan di bawah paket yang berbeda.
Dalam kasus Guru dan Budak, mapper yang sama akan dibaca dan ditulis pada saat yang sama. Tidak tepat untuk membuat dua, gunakan saja yang sama. Namun, dalam hal ini, perlu dicatat bahwa Spring secara otomatis menghasilkan nama mapper dan jenisnya sama, sehingga tidak dapat secara langsung disuntikkan ke antarmuka mapper. Itu perlu diselesaikan melalui sqlsession.
Konfigurasi Spring Basic
ApplicationContext.xml
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: konteks = "http: XMLNS: AOP = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/wwww.springframework http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <konteks: component-scan-package =" com.isea533.mybatis.service " location = "classpath: config.properties"/> <aop: aspectj-autoproxy/> <import resource = "spring-datasource-master.xml"/> <import resource = "spring-datasource-lave.xml"/>
File ini terutama memperkenalkan spring-datasource-master.xml dan spring-datasource-slave.xml.
Spring-Datasource-master.xml
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: tx = "http: XMLNS: AOP = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/wwww.springframework http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http:/www.spramewework.org/schema/aop http:spfrewework.orgewework http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" DataSourCemaster "init-method =" init "dashed-method =" tutup "> <nama properti =" driverclassname "value =" $ {master.jdbc.driver "" value "" $ "$ {$ {Master.jdbc.driver" " value = "$ {master.jdbc.url}"/> <name properti = "username" value = "$ {master.jdbc.user}"/> <name properti = "kata sandi" value = "$ {master.jdbc.password}"/> <nama properti = "filters" value = "state"/> <password} "/> <nama properti =" filters "value =" stat "/> <pro property =" ACOVET = "20" NAMA "" NAMA "" NAMA "" NOVET "/ACTATIF =" NAMA "/AKURE"/ACTATIF = "NAMA"/ACTATIF = "NAMA"/ACTATIF = " value = "1"/> <name properti = "maxwait" value = "60000"/> <name properti = "minidle" value = "1"/> <name properti = "timebetweenevictionrunsmillis" value = "60000"/> <name properti = "MinEvictableIdletery" value = "300000"/> <nama properti = "validiony" validy "validy" validiony "validy" validy "validiony" validy "name =" 300000 " name = "testwhileIdle" value = "true"/> <name properti = "testonborrow" value = "false"/> <properti name = "testonreturn" value = "false"/> </ bean> <bean id = "sqlsessiesfactory1"> <nama properti = "data" ref = "Datasourcemaster" "> <dortocores =" DataSource "Ref =" DatasourCemaster "<pro property" <propaper = "DataSource" Ref = "DatasourCemaster" <pro property "" <propape = "DataSource" Ref = "DataSourcaster" <value>classpath:mapper/*.xml</value> </array> </are> </bean> <bean> <bean> <property name="basePackage" value="com.isea533.mybatis.mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory1"/> </bean> <bean id = "sqlSessionMaster" scope = "prototipe"> <constructor-arg index = "0" ref = "sqlSessionFactory1"/> </ bean> <aop: config> <aop: pointcut id = "appservice" expression (*com.isea5333.mybata. Saran-REF = "TXAdvice1" pointcut-ref = "appService"/> </aop: config> <tx: nasihat id = "txadvice1" transaction-manager = "transactionManager1"> <tx: atribut> <tx: nama metode = "pilih*" read-only = "true"/<x: tx: Metode: "Metode =" Pilih*"Read-Only =" True "/<TX: Metode:" Metode = "TOAD-ONTLE*" Read-Only = "True"/<TX: Metode: "Metode =" TOKA "" BACA-ONLY-ONLY = "TRUE"/<TX: METODE METODE = " name = "get*" read-only = "true"/> <tx: Metode name = "get*" read-only = "true"/> <tx: Metode name = "*"/> </tx: atribut> </tx: nasihat> <bean id = "transactionManager1"> </bean = "datasource" refr = "DataSourCemaster" "> </datasource" datasource "ref =" DataSourCemaster ""> </datasource "datasource" ref = "DataSourCemaster" "> </datasource" DATASREM = "DATASOURCEMASTER1"> </datasource "DATASURCE" DATASURCEMASTER "/BEAN/BEAN/BEAN/BEAN/BEAN/BEAN/BEAN/BEAN/BEAN/DATASEC =" DataSourCemaster ">Spring-Datasource-Slave.xml
Ada sedikit perbedaan antara itu dan master, terutama karena ada perbedaan antara nama ID dan konfigurasi sumber data.
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: tx = "http: XMLNS: AOP = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/wwww.springframework http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http:/www.spramewework.org/schema/aop http:spfrewework.orgewework http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" datasourceslave "init-method =" init "dash-method =" tutup "> <nama properti =" driverclassname "value =" $ {slave.jdc.dras value="${slave.jdbc.url}"/> <property name="username" value="${slave.jdbc.user}"/> <property name="password" value="${slave.jdbc.password}"/> <property name="filters" value="stat"/> <property name="maxActive" value="20"/> <property name="initialSize" value = "1"/> <name properti = "maxwait" value = "60000"/> <name properti = "minidle" value = "1"/> <name properti = "timebetweenevictionrunsmillis" value = "60000"/> <name properti = "MinEvictableIdletery" value = "300000"/> <nama properti = "validiony" validy "validy" validiony "validy" validy "validiony" validy "name =" 300000 " name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> </bean> <bean id="sqlSessionFactory2" > <property name="dataSource" ref="dataSourceSlave"/> <property name="mapperLocations"> <array> <value>classpath:mapper/*.xml</value> </array> </are> </bean> <bean> <bean> <property name="basePackage" value="com.isea533.mybatis.mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"/> </bean> <bean id = "sqlSessionslave" scope = "prototipe"> <constructor-arg index = "0" ref = "sqlSessionFactory2"/> </ bean> <aop: config> <aop: pointcut id = "appservice" expression (*com.isea533.mybata. Saran-REF = "TXAdvice2" PointCut-Ref = "AppService"/> </aop: config> <tx: nasihat id = "txadvice2" transaction-manager = "transactionManager2"> <tx: atribute2 "<tx: name ="*"TRIA-ONLY =" true "/> </tx: Atributes =" TRANSACTEP: TRANSACH: TRANSACH: TRANSACH: TRANSACH: TRANSACH: "TRIBUTE/TRIBUTE" TX: "TRIBUTE/TX: TRIBUTE; name = "DataSource" Ref = "DataSourcesLave"/> </tean> </tobel>Perlu dicatat di sini bahwa <tx: Metode name = "*" baca-only = "true"/> adalah hanya baca. Jika ini bukan perpustakaan budak, Anda dapat mengonfigurasinya sesuai dengan perpustakaan utama.
Dalam kode berikut:
<Bean> <name properti = "Basepackage" value = "com.isea533.mybatis.mapper"/> <name properti = "sqlSessionFactoryBeanName" value = "sqlSessionFactory2"/> </bean>
SQLSessionFactory yang berbeda harus ditentukan melalui SQLSessionFactoryBeanName.
config.properties
# Konfigurasi Database - Mastermaster.jdbc.driverclass = com.mysql.jdbc.drivermaster.jdbc.url = jdbc: mysql: //192.168.1.11: 3306/testmaster.jdbc.user = rootmaster.jdbc.passkors = jjdbc.user = rootmaster.jdbc.passaskors = jjdbc.user = rootmaster.jdbc.passaskword = jjjes.user = rootmaster.jdbc.passsass.passer = jjjes.user = rootmaster.jdbc.passsass.passer = jjjes.user = rootmaster.jdbc.passsass.passer = jjjes.user = rootmaster.jdbc.passsass com.mysql.jdbc.driverslave.jdbc.url = jdbc: mysql: //192.168.1.22: 3306/testslave.jdbc.user = rootslave.jdbc.password = jj
Menggunakan mapper
Ini ditetapkan untuk situasi master dan budak. Dua pemetaan pemindaian konfigurasi adalah sama, sehingga mereka tidak dapat secara langsung disuntikkan, sehingga mereka perlu disuntikkan melalui metode yang merepotkan di bawah ini.
@Servicepublic kelas demoservice {private countrymapper writemapper; Readmapper countrymapper pribadi; @Resource (name = "sqlsessionMaster") public void setWritemapper (sqlsession sqlsession) {this.writemapper = sqlsession.getMapper (countrymapper.class); } @Resource (name = "sqlSessionslave") public void setReadMapper (sqlSession sqlsession) {this.readmapper = sqlsession.getMapper (countrymapper.class); } public int save (country country) {return writemapper.insert (country); } Daftar Publik <Ogara> SelectPage (int pagenum, int pageSize) {pageHelper.startpage (pagenum, pagesize); return readmapper.select (null); }}Karena SQLSession dapat dibedakan dengan nama, kami mendapatkan mapper dari SQLSession.
Selain itu, jika Anda perlu mempertimbangkan saat menulis dan membaca dalam transaksi yang sama, Anda perlu menggunakan penulisan yang sama sehingga data terbaru dalam transaksi dapat diperoleh saat membaca.
Di atas adalah situasi tuan dan budak.
Dalam kasus partisi perpustakaan, karena pemetaan yang berbeda berada di bawah paket yang berbeda, Anda dapat secara langsung menyuntikkan mapper menggunakan @Resource atau @Autowired, dan tidak perlu mendapatkannya melalui SQLSession.
Artikel ini hanyalah referensi untuk beberapa sumber data. Harap pertimbangkannya sesuai dengan situasi Anda sendiri saat menerapkannya dalam praktik.
Di masa depan, saya akan menggunakan waktu luang saya untuk mencoba mengembangkan plug-in yang secara otomatis dapat beralih sumber data berdasarkan artikel ini dan dua tautan terkait di atas ke MySQL beberapa sumber data. Karena saya tidak terlalu terbiasa dengan aplikasi praktis di bidang ini, saya menyambut semua orang untuk meninggalkan pesan untuk membagikan solusi mereka sendiri. Semakin banyak saya tahu tentang ini, semakin besar kemungkinan untuk mengembangkan plug-in switching sumber data umum.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.