Configuración de fuente de múltiples datos myBatis (separación de lectura-escritura)
En primer lugar, la forma más directa de usar la configuración en este artículo puede ser muy problemática de usar realmente.
Puede haber múltiples combinaciones en aplicaciones reales. Puede comprender el significado de este artículo y no usarlo rígidamente.
Posibles situaciones con múltiples fuentes de datos
1. Maestro y esclavo
Por lo general, es el caso donde MySQL tiene un maestro y múltiples esclavos. El ejemplo en este artículo es el caso en el que están los maestros y los esclavos, pero solo hay dos fuentes de datos, por lo que no es demasiado problemático usar la configuración directa, pero no es propicio para la expansión posterior. Se usa principalmente como ejemplo para ilustrar. Considere cuidadosamente en la operación real.
2. Dividiendo la biblioteca
Cuando la independencia del negocio es fuerte y el volumen de datos es grande, para mejorar la concurrencia, las tablas pueden dividirse. Después de dividir la base de datos, cada base de datos debe configurar una fuente de datos.
En este caso, puede consultar este artículo, pero es necesario tener en cuenta que el mapeador correspondiente a cada base de datos debe distinguirse y configurar convenientemente en diferentes paquetes.
Además, cuando hay particiones de bases de datos, habrá casos de esclavo maestro. Si tiene demasiadas bibliotecas de esclavos de base de datos, consulte los métodos proporcionados anteriormente o encuentre otras formas de resolver el problema.
Subcontrato
En el caso de la partición, los mapeadores de diferentes bases de datos deben colocarse en diferentes paquetes.
En el caso del maestro y el esclavo, el mismo mapeador será leído y escrito al mismo tiempo. No es apropiado crear dos, solo use el mismo. Sin embargo, en este caso, es necesario tener en cuenta que Spring genera automáticamente el nombre del mapeador y el tipo es el mismo, por lo que no se puede inyectar directamente en la interfaz mapeador. Debe resolverse a través de SQLSession.
Configuración básica de Spring
ApplicationContext.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema -instance" xmlns: context = "http://wwww.springframe xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/www.springframework.org/schema/scoans/spring-beans http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/aop/ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <context: component-scan base-package =" com.isea533.mybatis.service " ubicación = "classpath: config.properties"/> <aop: spectJ-AUTOPROXY/> <Import Resource = "Spring-DataSource-Master.xml"/> <importe resource = "Spring-DataSource-Slave.xml"/>>
Este archivo presenta principalmente spring-dataSource-Master.xml y Spring-DataSource-Slave.xml.
Spring-Datasource-Master.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschemainstance" xmlns: tx = "http://wwww.springffraward.org/org/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/www.springframework.org/schema/scoans/spring-beans http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframe.org/schema/aop http://wwww.springffrffrffrffram http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" dataSourCemaster "init-method =" init "destruye-method =" Close "> <Property Name =" DriverClassNeN "Value =" $ {Master.jdbc.Driverclass} "/> <Nombre de propiedad =" Usl "Usl" Url " value = "$ {maestro.jdbc.url}"/> <propiedad name = "username" value = "$ {Master.jdbc.user}"/> <propiedad name = "contraseña" value = "$ {maestro.jdbc.password}"/> <propiedad name = "filters" value = "stat"/> <name de la propiedad = "máxactivo" value = "20"/20 "/20"/> 20 "20" valor = "1"/> <propiedad name = "maxwait" valor = "60000"/> <propiedad name = "minidle" value = "1"/> <propiedad name = "timebetweeVictionRunsMillis" value = "60000"/> <Property name = "mineVictableDletEmillis" Value = "300000"/> <Nombre de propiedad = "Validación" Valor "Value" Valor "Valor"/"Valor" ". name = "test WhipleIdle" valor = "true"/> <propiedad name = "testOnBorrow" value = "false"/> <propiedad name = "testOnreturn" value = "false"/> </bean> <bean id = "sqlsessionFactory1"> <Property = "dataSource" ref = "dataSCemaster"/> <name de propiedad = "mapePLocations"> <RArHAray>> dataSource "ref =" dataSourcaster "/> <name de propiedad =" mApperLocations "> <RArHArHAray>>" Ref = "dataSourcast"/> <name de propiedad = "mApperLocations"> <RatRAray> <value> classpath: mapper/*. xml </value> </gray> </s are> </bean> <Bean> <Bean> <Property Name = "BasePackage" value = "com.isea533.mybatis.mapper"/> <Property Name = "SqlSessionFactoryBeanNameNameName" Value = "Sqlsession1"/> </> </> </</"sqlSessionFactoryBasterMaster scope = "prototipo"> <constructor-arg index = "0" ref = "sqlsessionFactory1"/> </rena> <aop: config> <aop: pointcut id = "appService" Expression = "Ejecution (*com.isea533.mybatis.service ..*Servicio*.*(..))" PointCut-ref = "appService"/> </aop: config> <tx: adsors id = "txadvice1" transaction-ganager = "transactionManager1"> <tx: atributes> <tx: método name = "select*" readly = "true"/> <tx: name de método = "buscar*" lectura = "verdadero"/> <tx: name de método = "ree read Only = "True"/> <tx: Method name = "get*" read-only = "true"/> <tx: método name = "*"/> </tx: atributes> </tx: consejo> <bean id = "transaccionManager1"> <Property name = "dataSource" ref = "dataSourcemaster"/> </ beachs>spring-dataSource-slave.xml
Hay poca diferencia entre TI y Master, principalmente porque hay una diferencia entre el nombre de ID y la configuración de la fuente de datos.
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschemainstance" xmlns: tx = "http://wwww.springffraward.org/org/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/www.springframework.org/schema/scoans/spring-beans http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframe.org/schema/aop http://wwww.springffrffrffrffram http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" dataSourceSlave "init-method =" init "destruye-method =" Close "> <Property Name =" DriverClassNeN "Value =" $ {Slave.jdbc.drivclass} "/> <Nombre de propiedad =" Url "Url" valor = "$ {slave.jdbc.url}"/> <propiedad name = "username" value = "$ {slave.jdbc.user}"/> <propiedad name = "contraseña" value = "$ {slave.jdbc.password}"/> <name de propiedad = "filtros" value = "estadística"/> name = "name de propiedad =" mAxActive "value =" 20 "20" 20 "/" 20 " valor = "1"/> <propiedad name = "maxwait" valor = "60000"/> <propiedad name = "minidle" value = "1"/> <propiedad name = "timebetweeVictionRunsMillis" value = "60000"/> <Property name = "mineVictableDletEmillis" Value = "300000"/> <Nombre de propiedad = "Validación" Valor "Value" Valor "Valor"/"Valor" ". 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> <valor> classpath: mapper/*. xml </value> </gray> </sre> </reme> <reme> <Bean> <Property name = "basepackage" value = "com.isea533.mybatis.mapper"/> <Property = "sqlSessionFactoryBeanNameName" Value = "sqlSession2"/> </> </> </</> </"sqlSessionFactoryBeanName" Value = "sqlsession2"/> </> </</> </</"sqlSessionFactoryBeanName" Value = "sqlSession2"/> </> </> </</> <sper id = "SqlSessionSlave" scope = "prototype"> <constructor-arg index = "0" ref = "sqlSessionFactory2"/> </bean> <aop: config> <aop: punto id = "appService" Express ACONSED-REF = "TXADVICE2" PointCut-REF = "AppService"/> </aop: config> <tx: consejo id = "txadvice2" transaccion-ganager = "transaccionManager2"> <tx: attributes> <tx: método name = "*" Read = "true"/> </tx: Attributes> </tx: consejo> <sonsi = "TRANACTA > <Property name = "dataSource" ref = "dataSourcesSlave"/> </ beon> </les>Cabe señalar aquí que <tx: Method name = "*" read solo = "true"/> es solo de lectura. Si no es una biblioteca de esclavos, puede configurarla de acuerdo con la biblioteca principal.
En el siguiente código:
<Bean> <Property Name = "BasePackage" Value = "com.isea533.mybatis.mapper"/> <Property name = "sqlSessionFactoryName" value = "sqlSessionFactory2"/> </ bean>
Se deben especificar diferentes SQLSessionFactory a través de SQLSessionFactoryBeanName.
config.properties
# Configuración de la base de datos - Mastermaster.jdbc.drivulss = com.mysql.jdbc.drivermaster.jdbc.url = jdbc: mysql: //192.168.1.11: 3306/testmaster.jdbc.user = rootmaster.jdbc.password = jj# - slavaSlave.jdbc.driverclass = com.mysql.jdbc.driverslave.jdbc.url = jdbc: mysql: //192.168.1.22: 3306/testSlave.jdbc.user = rootslave.jdbc.password = jj
Usando mapeador
Esto está listo para la situación de maestro y esclavo. Los dos mapeadores de escaneo de configuración son los mismos, por lo que no se pueden inyectar directamente, por lo que deben inyectarse a través del método problemático a continuación.
@ServicePublic Class Demoservice {WriteMapper de CountryMapper privado; Readmapper privado CountryMapper; @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 (país); } Lista pública <comunional> selectPage (int pagenum, int pageSize) {pageHelper.StartPage (Pagenum, PageSize); return ReadMapper.select (nulo); }}Debido a que SQLSession se puede distinguir por su nombre, obtenemos el mapeador de SQLSession.
Además, si necesita considerar al escribir y leer en la misma transacción, debe usar el mismo WriteMapper para que se puedan obtener los últimos datos en la transacción al leer.
Lo anterior es la situación del maestro y el esclavo.
En el caso de la partición de la biblioteca, dado que diferentes mapeadores están en diferentes paquetes, puede inyectar directamente el mapeador usando @Resource o @aUtowired, y no es necesario obtenerlo a través de SQLSession.
Este artículo es solo una referencia para múltiples fuentes de datos. Considérelo de acuerdo con su propia situación al aplicarlo en la práctica.
En el futuro, usaré mi tiempo libre para tratar de desarrollar complementos que puedan cambiar automáticamente las fuentes de datos en función de este artículo y los dos enlaces relacionados anteriormente a MySQL múltiples fuentes de datos. Debido a que no estoy muy familiarizado con la aplicación práctica en esta área, doy la bienvenida a todos para dejar un mensaje para compartir sus propias soluciones. Cuanto más sé sobre esto, más probabilidades tendrá de desarrollar un complemento de conmutación de fuente de datos general.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.