Mybatis Multi-Data Source Configuration (разделение чтения-записи)
Прежде всего, наиболее прямой способ использования конфигурации в этой статье может быть очень хлопотно для использования.
В реальных приложениях может быть несколько комбинаций. Вы можете понять значение этой статьи и не использовать ее жестко.
Возможные ситуации с несколькими источниками данных
1. Мастер и раб
Обычно это тот случай, когда у MySQL есть один мастер и несколько рабов. Примером в этой статье является случай, когда мастер и рабы, но есть только два источника данных, поэтому не слишком трудно использовать прямую конфигурацию, но это не способствует последующему расширению. Он используется в основном в качестве примера для иллюстрации. Пожалуйста, внимательно рассмотрите это в реальной работе.
2. Разделив библиотеку
Когда независимость бизнеса сильна и объем данных большой, для улучшения параллелизма, таблицы могут быть разделены. После того, как база данных разделена, каждая база данных должна настроить источник данных.
В этом случае вы можете обратиться к этой статье, но необходимо отметить, что карта, соответствующий каждой базе данных, должен быть удобно различать и настроить в разных пакетах.
Кроме того, когда будут разделы базы данных, будут случаи мастер-раба. Если у вас слишком много библиотек рабов базы данных, пожалуйста, обратитесь к методам, представленным выше, или найдите другие способы решения проблемы.
Субподряд Mapper
В случае разбивания карты разных баз данных должны быть размещены в разных пакетах.
В случае мастера и раба такого же отображения будут читать и записаны одновременно. Не подходит для создания двух, просто используйте один и тот же. Однако в этом случае необходимо отметить, что Spring автоматически генерирует имя Mapper, а тип одинаков, поэтому она не может быть непосредственно введена в интерфейс Mapper. Это должно быть решено через SQLSession.
Базовая конфигурация пружины
ApplicationContext.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-insstance" xmlns: context = "http://wwww.spramemema" xmlns: "http://www.spramema. xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.spramework.orgemabema/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 "> <Контекст: component-casion-package =" com.isea533.mybatis.service "/> <context-prackgest =" location = "classpath: config.properties"/> <aop: AspectJ-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
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-insstance" xmlns: tx = "http://www.spramemema". xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.spramework.orgemabema/spring- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aoppmemabema.spramewramework.org/schema/aopmemabema. http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" dataSourcemaster "init-method =" init "dissome-method =" close "> <свойство name =" riverclassname "value =" $ {master.jdbc.driverclass} "/> <свойство =" url "=". value = "$ {master.jdbc.url}"/> <name = "username" value = "$ {master.jdbc.user}"/> <name = "password" value = "$ {master.jdbc.password}"/> <property name = "filters" value = "stat"/> <name = "maxactive" value = "20". 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="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> </bean> <bean id="sqlSessionFactory1" > <property name="dataSource" ref="dataSourceMaster"/> <property name="mapperLocations"> <array> <dulch> classpath: mapper/*. xml </value> </array> </a at> </bean> <bean> <bean> <свойство = "basepackage" value = "com.isea533.mybatis.mapper"/> <property name = "sqlSessionFactafefactame" id = "sqlSessionMaster" scope = "prototype"> <constructor-arg index = "0" ref = "sqlSessionFactory1"/> </bean> <aop: config> <aop: pointcut id = "appservice" Expression = "exepression (*com.isea533.mybatis.service ..*(*(*com.isea53333.mybatis.service ..*. Asse-ref = "txadvice1" pointcut-ref = "appservice"/> </aop: config> <tx: usd id = "txadvice1" transaction-manager = "transactionManager1"> <TX: атрибуты> <TX: имя метода = "select nyly ="/> <tx: метод "Найти" sect-on "/tre-name =" tx "tx =" rete "/" tx = "tx". name = "get*" read-only = "true"/> <tx: method name = "get*" read-only = "true"/> <tx: method name = "*"/> </tx: атрибуты> </tx: консультант> <bean id = "transactionManager1"> <property name = "dataSource" ref = "dataSourcemaster"/> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </bean> </Bean> </bean> </bean> </bean> </bean> </beanceSpring-Datasource-Slave.xml
Существует небольшая разница между ним и мастером, в основном потому, что существует разница между именем идентификатором и конфигурацией источника данных.
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-insstance" xmlns: tx = "http://www.spramemema". xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.spramework.orgemabema/spring- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aoppmemabema.spramewramework.org/schema/aopmemabema. http://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id =" dataSourceslave "init-method =" init "dissome-method =" close "> <name =" riverclassname "value =" $ {slave.jdbc.driverclass} "/> <propass =" value = "$ {slave.jdbc.driverclass}"/> "url" = "url" = "url" = ". value = "$ {slave.jdbc.url}"/> <name = "username" value = "$ {slave.jdbc.user}"/> <name = "password" value = "$ {slave.jdbc.password}"/> <property name = "filters" value = "/> <property name =" maxactive "value =" 20 ". 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 = "testWhileIdle" value = "true"/> <name = "testonBorrow" value = "false"/> <name = "testonReturn" value = "false"/> </bean> <bean id = "sqlSessionFactory2"> <property name = "dataSource" ref = "dataSourceSlave"/> <свойство name = "mapPerlocation <dulch> classpath: mapper/*. xml </value> </array> </a at> </bean> <bean> <bean> <свойство = "basepackage" value = "com.isea533.mybatis.mapper"/> <propackage = "sqlSessionFactafebeanname" id = "sqlSessionsLave" scope = "prototype"> <constructor-arg index = "0" ref = "sqlSessionFactory2"/> </bean> <aop: config> <aop: pointcut id = "appservice" Expression = "expression (*com.isea533.mybatis.service ..*Service*. Asse-ref = "txAdvice2" pointcut-ref = "appservice"/> </aop: config> <tx: used id = "txadvice2" transaction-manager = "transactionManager2"> <TX: атрибуты> <Tx: имя метода = "*" id = "TransactionManager2"> <name = "dataSource" ref = "dataSourceslave"/> </bean> </beans>Здесь следует отметить, что <tx: method name = "*" read-only = "true"/> только для чтения. Если это не рабовладельческая библиотека, вы можете настроить ее в соответствии с основной библиотекой.
В следующем коде:
<Bean> <name = "name =" basepackage "value =" com.isea533.mybatis.mapper "/> <name =" sqlSessionFactoryBeanName "value =" sqlSessionFactory2 "/> </bean>
Различные sqlSessionFactory должны быть указаны через SQLSessionFactoryBeanName.
config.properties
# Конфигурация базы данных - mastermaster.jdbc.driverclass = com.mysql.jdbc.drivermaster.jdbc.url = jdbc: mysql: //192.168.1.11: 3306/testmaster.jdbc.user = rootmaster.jdbc.password = jj## - slaveslaveslaves.jdiverc.driver = rootmaster.jdbc.password = jj## -slaveslaves.jdiver.jdiver = rootmaster.jdbc.passsword = jj### -slaveslaves.jdiver. com.mysql.jdbc.driverslave.jdbc.url = jdbc: mysql: //192.168.1.22: 3306/testslave.jdbc.user = rotslave.jdbc.password = jj
Использование Mapper
Это настроено на ситуацию в мастер -и раб. Два сортировщика сканирования конфигурации одинаковы, поэтому их нельзя вводить непосредственно, поэтому их необходимо вводить с помощью неприятного метода ниже.
@Servicepublic class demoservice {private countrymapper writemapper; Частный CountryMapper ReadMapper; @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 (страна страна) {return writemapper.insert (страна); } public List <Country> selectPage (int pagenum, int pagesize) {pageHelper.StartPage (pagenum, pageSize); return readmapper.select (null); }}Поскольку SQLSession можно различить по имени, мы получаем Mapper от SQLSession.
Кроме того, если вам нужно рассмотреть при написании и чтении в той же транзакции, вам необходимо использовать тот же raiseemapper, чтобы при чтении можно было получить последние данные в транзакции.
Вышеупомянутое ситуация Мастера и Раба.
В случае раздела библиотеки, поскольку разные картины находятся в разных пакетах, вы можете непосредственно вводить Mapper, используя @Resource или @Autowired, и нет необходимости получать его через SQLSession.
Эта статья является лишь ссылкой для нескольких источников данных. Пожалуйста, рассмотрите это в соответствии с вашей собственной ситуацией при применении ее на практике.
В будущем я буду использовать свое свободное время, чтобы попытаться разработать плагины, которые могут автоматически переключать источники данных на основе этой статьи и две связанные ссылки, выше, на несколько источников данных MySQL. Поскольку я не очень хорошо знаком с практическим применением в этой области, я приветствую всех оставлять сообщение, чтобы поделиться своими собственными решениями. Чем больше я знаю об этом, тем больше вероятность того, что он будет разработать общий плагин переключения источников данных.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.