MyBatis Multi-Data-Quellkonfiguration (Abtrennung von Read-Write)
Zunächst kann die direkteste Möglichkeit, die Konfiguration in diesem Artikel zu verwenden, sehr problematisch zu verwenden.
Es kann mehrere Kombinationen in tatsächlichen Anwendungen geben. Sie können die Bedeutung dieses Artikels verstehen und sie nicht streng verwenden.
Mögliche Situationen mit mehreren Datenquellen
1. Meister und Sklave
Normalerweise ist es der Fall, in dem MySQL einen Master und mehrere Sklaven hat. Das Beispiel in diesem Artikel ist der Fall, in dem sich Master und Sklaven befinden, aber es gibt nur zwei Datenquellen, daher ist es nicht zu störend, direkte Konfiguration zu verwenden, aber es ist nicht förderlich für die anschließende Erweiterung. Es wird hauptsächlich als Beispiel zur Veranschaulichung verwendet. Bitte betrachten Sie es sorgfältig im tatsächlichen Betrieb.
2. Teilen der Bibliothek
Wenn die Unabhängigkeit des Geschäfts stark ist und das Datenvolumen groß ist, um die Parallelität zu verbessern, können Tabellen aufgeteilt werden. Nachdem die Datenbank geteilt wurde, muss jede Datenbank eine Datenquelle konfigurieren.
In diesem Fall können Sie sich auf diesen Artikel beziehen, aber es ist zu beachten, dass der Mapper, der jeder Datenbank entspricht, bequem unterschieden und unter verschiedenen Paketen konfiguriert werden sollte.
Wenn es Datenbankpartitionen gibt, gibt es außerdem Master-Slave-Fälle. Wenn Sie zu viele Datenbank -Sklavenbibliotheken haben, finden Sie auf die oben angegebenen Methoden oder finden Sie andere Möglichkeiten, um das Problem zu lösen.
Mapper Subunternehmer
Im Falle einer Partitionierung müssen die Mapper verschiedener Datenbanken unter verschiedene Pakete platziert werden.
Im Fall von Master und Slave wird der gleiche Mapper gleichzeitig gelesen und geschrieben. Es ist nicht angemessen, zwei zu erstellen, sondern nur denselben verwenden. In diesem Fall ist jedoch zu beachten, dass Feder automatisch den Namen des Mapper generiert und der Typ gleich ist, sodass er nicht direkt in die Mapper -Schnittstelle eingeleitet werden kann. Es muss durch SQLSession gelöst werden.
Federbasiskonfiguration
applicationContext.xml
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-sinstance xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.spingframework.org/schema/beans http://www.springramedramework.org/schema/schema/schema/schema/schema/schema/schems/bes 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 "> <context: component-scan-base-package =" com.isea533.mybatis.scr. location = "classPath: config.Properties"/> <AOP: Aspektj-autoproxy/> <import ressourcen = "fing-datasource-master.xml"/> <import ressourcen = "Spring-DataSource-Slave.xml"/>
In dieser Datei wird hauptsächlich Springdatasource-Master.xml und Springdatasource-Slave.xml vorgestellt.
Springdatasource-Master.xml
<beans xmlns = "http://www.springframework.org/schema/bean xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.spingframework.org/schema/beans http://www.springramedramework.org/schema/schema/schema/schema/schema/schema/schems/bes http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.sprungramework.org/schema/aops./www.springfry./aopema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" dataSourcemaster "init-method =" init "destroy-method =" close "> <Property name =" driverClassname "value =" $ $ {master.jdbc.driverclasse | value = "$ {master.jdbc.url}"/> <Eigenschaft name = "userername" value = "$ {master.jdbc.user}"/> <Eigenschaft name = "password" value = "$ {master.jdbc.password}"/> <Eigentum "filters" value = "stat" stat "/> <Mobilienname". value="1"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="1"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 'x'"/> <property name = "test während <wert> classPath: mapper/*. xml </value> </array> </sind> </bean> <bean> <bean> <Eigenschaft name = "Basepackage" value = "com.isea533.mybatis.mapper"/> <Property name = " id = "sqlSessionMaster" scope = "prototyp"> <constructor-arg index = "0" ref = " advice-ref="txAdvice1" pointcut-ref="appService"/> </aop:config> <tx:advice id="txAdvice1" transaction-manager="transactionManager1"> <tx:attributes> <tx:method name="select*" read-only="true"/> <tx:method name="find*" read-only="true"/> <tx:method name="get*" read-only="true"/> <tx:method name="get*" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <bean id="transactionManager1" > <property name="dataSource" ref="dataSourceMaster"/> </bean></beans>Springdatasource-Slave.xml
Es gibt kaum einen Unterschied zwischen IT und Master, vor allem, weil es einen Unterschied zwischen dem ID -Namen und der Datenquellenkonfiguration gibt.
<beans xmlns = "http://www.springframework.org/schema/bean xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.spingframework.org/schema/beans http://www.springramedramework.org/schema/schema/schema/schema/schema/schema/schems/bes http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.sprungramework.org/schema/aops./www.springfry./aopema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" dataSourceslave "init-method =" init "destroy-method =" close "> <Property name =" driverclassname "value =" $ {slave.jdbc.driverclasse} 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"/> <Eigenschaft name = "maxwait" value = "60000"/> <Eigenschaft name = "minidle" value = "1"/> <Eigenschaft name = "TimeBetweenevictionRunsmillis" value "value =" 60000 "/> <Eigenschaft name =" mineVictableSletimillis "value" value "300000" 300000 "300000" 300000 "300000"/"300000"/"/> < 'x' "/> <Eigenschaft name =" testle itIdle "value =" true "/> <Eigenschaft name =" testonborrow "value =" false "/> <Eigenschaft name =" testonReturn "value =" false "/> </bean> <bean id =" <wert> classPath: mapper/*. xml </value> </array> </sind> </bean> <bean> <bean> <Eigenschaftsname = "Basepackage" value = "com.isea533.mybatis.mapper"/> <Property name = " id = "SQLSESSIONSLAVE" scope = "prototyp"> <constructor-arg Index = "0" ref = " Ratschläge-ref = "txadvice2" pointcut-ref = "appService"/> </aop: config> <tx: patcing id = "txadvice2" transaction-Manager = "transactionManager2"> <tx: Attribute> <Tx: Methode name = "*" schreibgeschützt = "truehandy"> </tx: Attributes> </tx: tx: tx. <Eigenschaft name = "dataSource" ref = "dataSourceslave"/> </bean> </beans>Es ist hier zu beachten, dass <tx: method name = "*" schreibgeschützt = "true"/> schreibgeschützt ist. Wenn es sich nicht um eine Sklavenbibliothek handelt, können Sie sie gemäß der Hauptbibliothek konfigurieren.
Im folgenden Code:
<bean> <Property name = "Basepackage" value = "com.isea533.mybatis.mapper"/> <Eigenschaft name = "sqlSessionfactoryBeanname" value = "
Verschiedene SQLSessionFactory müssen durch SQLSessionFactoryBeanname angegeben werden.
config.Properties
# Datenbankkonfiguration - mastermaster.jdbc.driverclass = com.mysql.jdbc.drivermaster.jdbc.url = jdbc: mysql: //192.168.1.11: 3306/testmaster.jdbc.user = rootmaster.jdbc. jjdbc.password = jjdbc.password = jjdbc.password com.mysql.jdbc.driverslave.jdbc.url = jdbc: mysql: //192.168.1.22: 3306/testslave.jdbc.user = rootslave.jdbc.password = jj
Verwenden von Mapper
Dies gilt für die Master- und Sklavensituation. Die beiden Konfigurations -Scan -Mapper sind gleich, daher können sie nicht direkt injiziert werden, sodass sie durch die nachstehende störende Methode injiziert werden müssen.
@ServicePublic Class DemoService {private l CountryMapper WriteMapper; privates Landseiter Readmapper; @Resource (name = "sqlSessionMaster") public void setwritemapper (SQLSession SQLSession) {this.writemapper = } @Resource (name = "sqlSessionSionsLave") public void setReadMapper (SQLSession SQLSession) {this.ReadMapper = sqlSession.getMapper (lockingMapper.class); } public int Save (Country Country) {return writeMapper.insert (Land); } publiclist <Cound> selectPage (int pagenum, int pageSize) {pageHelper.startPage (pagenum, pageSize); return readMapper.Select (null); }}Da SQLSession namentlich unterschieden werden kann, erhalten wir den Mapper von SQLSession.
Wenn Sie beim Schreiben und Lesen in derselben Transaktion berücksichtigen müssen, müssen Sie außerdem denselben Writemapper verwenden, damit die neuesten Daten in der Transaktion beim Lesen erhalten werden können.
Das obige ist die Situation des Meisters und des Sklaven.
Im Falle einer Bibliothekspartition können Sie den Mapper direkt mit @Resource oder @Autowired unter verschiedenen Paketen befinden, und es ist nicht erforderlich, ihn über SQLSession zu erhalten.
Dieser Artikel ist nur eine Referenz für mehrere Datenquellen. Bitte betrachten Sie es nach Ihrer eigenen Situation, wenn Sie es in der Praxis anwenden.
In Zukunft werde ich meine Freizeit verwenden, um Plug-Ins zu entwickeln, mit denen Datenquellen automatisch auf diesem Artikel und den beiden zugehörigen Links oben auf MySQL-Datenquellen wechseln können. Da ich mit der praktischen Anwendung in diesem Bereich nicht sehr vertraut bin, begrüße ich alle, um eine Nachricht zu hinterlassen, um ihre eigenen Lösungen zu teilen. Je mehr ich über diese weiß, desto wahrscheinlicher ist es, ein allgemeines Plug-in für Datenquellen zu entwickeln.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.