Configuration de la source multi-données MyBatis (séparation en lecture-écriture)
Tout d'abord, le moyen le plus direct d'utiliser la configuration de cet article peut être très difficile à utiliser.
Il peut y avoir plusieurs combinaisons dans les applications réelles. Vous pouvez comprendre la signification de cet article et ne pas l'utiliser de manière rigide.
Situations possibles avec plusieurs sources de données
1. Maître et esclave
Habituellement, c'est le cas où MySQL a un maître et plusieurs esclaves. L'exemple de cet article est le cas où le maître et les esclaves sont, mais il n'y a que deux sources de données, il n'est donc pas trop difficile d'utiliser la configuration directe, mais elle n'est pas propice à l'expansion ultérieure. Il est principalement utilisé comme exemple pour illustrer. Veuillez le considérer attentivement en fonctionnement réel.
2. Diviser la bibliothèque
Lorsque l'indépendance des entreprises est forte et que le volume de données est important, afin d'améliorer la concurrence, les tables peuvent être divisées. Une fois la base de données divisée, chaque base de données doit configurer une source de données.
Dans ce cas, vous pouvez vous référer à cet article, mais il est nécessaire de noter que le mappeur correspondant à chaque base de données doit être pratiquement distingué et configuré dans différents packages.
De plus, lorsqu'il y a des partitions de base de données, il y aura des cas de maître-esclave. Si vous avez trop de bibliothèques d'esclaves à base de données, veuillez consulter les méthodes fournies ci-dessus, ou trouver d'autres moyens de résoudre le problème.
Sous-traitance de mappeur
Dans le cas du partitionnement, les mappeurs de différentes bases de données doivent être placés sous différents packages.
Dans le cas du maître et de l'esclave, le même mappeur sera lu et écrit en même temps. Il n'est pas approprié d'en créer deux, il suffit d'utiliser le même. Cependant, dans ce cas, il est nécessaire de noter que Spring génère automatiquement le nom du mappeur et que le type est le même, il ne peut donc pas être injecté directement dans l'interface de mappel. Il doit être résolu par SQLSession.
Configuration de base de Spring
applicationContext.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/bans/www.springframework.org/schema/Beans/www.spring 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 location = "classPath: config.properties" /> <aop: aspectj-utoproxy /> <importance rdery = "spring-datasource-master.xml" /> <importance = "spring-datasource-slave.xml" />
Ce fichier introduit principalement Spring-Datasource-Master.xml et Spring-Datasource-Slave.xml.
printemps-datasource-master.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: tx = "http://www.springfrrawwork.org/tched "/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/bans/www.springframework.org/schema/Beans/www.spring http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springfrrawouma/aop http://www.springfrrame http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" dataSourCemaster "init-method =" init "destren-Method =" propriété name = "DriverClassname" Value = "$ {maître.jdbc. Value = "$ {Master.jdbc.url}" /> <propriété name = "username" value = "$ {maître.jdbc.user}" /> <propriété name = "Password" value = "$ {maître.jdbc.password}" /> <propriété name = "filters" value = "stat" /> <propriété = "maxcactive" value = "20" 20 " Value = "1" /> <propriété name = "maxwait" value = "60000" /> <propriété name = "minidle" value = "1" /> <propriété name = "timebetweenvictionrunsmillis" value = "60000" /> <propriété = "MinevictableIdletimemillis" value = "300000" /> <propriété = "vaill name = "test WhiteIdle" value = "true" /> <propriété name = "testonBorrow" value = "false" /> <propriété name = "testonreturn" value = "false" /> </ bean> <bean id = "sqlSessionFactory1"> <propriété name = "dataSource" REF = "DataSourCaster" /> <propriété name = "MAPREP <value> CLASSPATH: MAPTER / *. XML </ Value> </RayS> </ Are> </EAND> <EAN> <EAN> <Propriété Name = "BASEPACKAGE" Value = "com.isea533.mybatis.mapper" /> <propriété name = "SQLSESSESSFACTORYBEANNEM scope = "Prototype"> <Constructor-Arg index = "0" ref = "SqlSessionFactory1" /> </Eb> <aop: config> <aop: PointCut id = "appservice" expression = "EXECUTION (* com.isea533.mybatis.service .. * Service *. * (..))" /> <aop: ADVISOR CONSECT PointCut-ref = "AppService" /> </ aop: config> <tx: conseils id = "txadvice1" transaction-manager = "transactionManager1"> <tx: attributes> <tx: méthode name = "select *" read-only = "true" /> <tx: méthode name = "find *" read-only = "true" /> <tx: méthode = "get *" read only = "true" /> <tx: méthode name = "get *" read-only = "true" /> <tx: méthode name = "*" /> </ tx: attributes> </ tx: conseils> <bean id = "transactionManager1"> <propriété name = "dataSource" ref = "dataSourCaster" /> </ beebrprintemps-datasource-slave.xml
Il y a peu de différence entre l'informatique et le maître, principalement parce qu'il existe une différence entre le nom d'ID et la configuration de la source de données.
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: tx = "http://www.springfrrawwork.org/tched "/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/bans/www.springframework.org/schema/Beans/www.spring http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springfrrawouma/aop http://www.springfrrame http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" dataSourceslave "init-method =" init "destren-thod =" propriété name = "driverclassname" value = "$ {Slave.jdbc.DriverClass}" /> <woftaméli Value = "$ {Slave.jdbc.url}" /> <propriété name = "username" value = "$ {slave.jdbc.user}" /> <propriété name = "mot de passe" value = "$ {slave.jdbc.password}" /> <propriété name = "filters" value = "stat" /> <propriété nom = "Maxcactive" value = "20" /> <vrai name = "initialSize" value = "1" /> <propriété name = "maxwait" value = "60000" /> <propriété name = "MINIDLE" value = "1" /> <propriété name = "TimeBetweenvictionRunsmillis" value = "60000" /> <propriété name = "MineVictableIdleMelis" value = "300000" /> <pommander name = "VALIDEQUER" 'x' "/> <propriété name =" Test WhileIdle "value =" true "/> <propriété name =" testonborrow "value =" false "/> <propriété name =" testonreturn "value =" false "/> </ank> <bean id =" sqlSessionFactory2 "> <propriété name =" dataSource "rebelle> <value> CLASSPATH: MAPTER / *. XML </ Value> </RayS> </ Are> </EAND> <EAN> <EAN> <Property Name = "BASEPACKAGE" Value = "com.isea533.mybatis.mapper" /> <propriété name = "SqlSessionFactoryBeanName" value = "sqlSessionfactory2" /> </ bean id = "SqlSessionsLave" Scope = "Prototype"> <Constructor-Arg index = "0" Ref = "SqlSessionFactory2" /> </ Bean> <aop: config> <aop: PointCut id = "AppService" Expression = "EXECUTION (* COM.IISEA533.MyBatis.Service .. * Service *. conseils-ref = "txAdvice2" Pointcut-ref = "appservice" /> </ aop: config> <tx: conseils id = "txadvice2" transaction-manager = "transactionManager2"> <tx: attributes> <tx: méthode name = "*" read-only = "true" /> </tx: rattibutes> > <propriété name = "dataSource" ref = "dataSourceslave" /> </ank> </bans>Il convient de noter ici que <tx: méthode name = "*" readly = "true" /> est en lecture seule. S'il ne s'agit pas d'une bibliothèque d'esclaves, vous pouvez la configurer en fonction de la bibliothèque principale.
Dans le code suivant:
<an Bean> <propriété name = "basepackage" value = "com.isea533.mybatis.mapper" /> <propriété name = "SqlSessionFactoryBeanName" value = "SqlSessionFactory2" /> </Ean>
Différents SQLSessionFactory doivent être spécifiés via SQLSessionFactoryBeanName.
config.properties
# Configuration de la base de données - MasterMaster.jdbc.DriverClass = com.mysql.jdbc.Driverermaster.jdbc.url = jdbc: mysql: //192.168.1.11: 3306 / testmaster.jdbc.Eser = rootmaster.jdbc. com.mysql.jdbc.driverslave.jdbc.url = jdbc: mysql: //192.168.1.22: 3306 / testslave.jdbc.user = rootslave.jdbc.password = jj
Utilisation du mappeur
Ceci est défini pour la situation maître et esclave. Les deux mappeurs de balayage de configuration sont les mêmes, donc ils ne peuvent pas être directement injectés, ils doivent donc être injectés via la méthode gênante ci-dessous.
@ServicePublic Class Demoservice {private countrymapper writeMapper; Readmapper de countrymapper privé; @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); } public list <pays selectPage (int pagenum, int pagesize) {pageHelper.startPage (pagenum, pagesize); readmapper.Select (null); }}Parce que SQLSession peut être distinguée par son nom, nous obtenons le mappeur de SQLSession.
De plus, si vous devez considérer lors de la rédaction et de la lecture dans la même transaction, vous devez utiliser le même écriture afin que les dernières données de la transaction puissent être obtenues lors de la lecture.
Ce qui précède est la situation du maître et de l'esclave.
Dans le cas de la partition de bibliothèque, comme différents cartons sont sous différents packages, vous pouvez directement injecter le mappeur à l'aide de @Resource ou @Autowired, et il n'est pas nécessaire de l'obtenir via SQLSession.
Cet article n'est qu'une référence pour plusieurs sources de données. Veuillez le considérer en fonction de votre propre situation lors de l'application dans la pratique.
À l'avenir, j'utiliserai mon temps libre pour essayer de développer des plug-ins qui peuvent changer automatiquement les sources de données en fonction de cet article et des deux liens connexes ci-dessus vers les sources de données de MySQL. Parce que je ne connais pas très bien l'application pratique dans ce domaine, j'accueille tout le monde à laisser un message pour partager ses propres solutions. Plus j'en connais, plus il est susceptible de développer un plug-in de commutation de source de données générale.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.