Configuração de origem Mybatis Multi-Data (Separação de leitura de leitura)
Primeiro de tudo, a maneira mais direta de usar a configuração neste artigo pode ser muito problemática para realmente usar.
Pode haver várias combinações em aplicações reais. Você pode entender o significado deste artigo e não usá -lo rigidamente.
Possíveis situações com várias fontes de dados
1. Mestre e escravo
Geralmente, é o caso em que o MySQL tem um mestre e vários escravos. O exemplo deste artigo é o caso em que o mestre e os escravos estão, mas existem apenas duas fontes de dados, portanto, não é muito problemático usar a configuração direta, mas não é propício à expansão subsequente. É usado principalmente como exemplo para ilustrar. Por favor, considere isso com cuidado na operação real.
2. Dividindo a biblioteca
Quando a independência dos negócios é forte e o volume de dados é grande, para melhorar a simultaneidade, as tabelas podem ser divididas. Depois que o banco de dados é dividido, cada banco de dados precisa configurar uma fonte de dados.
Nesse caso, você pode consultar este artigo, mas é necessário observar que o mapeador correspondente a cada banco de dados deve ser convenientemente distinguido e configurado em diferentes pacotes.
Além disso, quando houver partições de banco de dados, haverá casos de escravos principais. Se você tiver muitas bibliotecas de escravos de banco de dados, consulte os métodos fornecidos acima ou encontre outras maneiras de resolver o problema.
Subcontrato de mapeador
No caso de particionamento, os mapeadores de diferentes bancos de dados devem ser colocados em diferentes pacotes.
No caso de mestre e escravo, o mesmo mapeador será lido e escrito ao mesmo tempo. Não é apropriado criar dois, basta usar o mesmo. No entanto, neste caso, é necessário observar que a mola gera automaticamente o nome do mapeador e o tipo é o mesmo, para que não possa ser injetado diretamente na interface do mapeador. Ele precisa ser resolvido através do SQLSession.
Configuração básica da primavera
ApplicationContext.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-nstance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans O http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/sringop.xsd. Base-Package = "com.isea533.mybatis.service"/> <Contexto: Property-placeholder Location = "ClassPath: config.properties"/> <aOP: AspectJ-AutoProxy/> <importação Resource = "Spring-DataSource-Master.xml"/>
Este arquivo apresenta principalmente a primavera-datasource-master.xml e a mola datasource-slave.xml.
Spring-DataSource-mestre.xml
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-nstance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.sringframework.org/schema http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schean/aop/springop.xsd "] Destroy-method = "Close"> <propriedade name = "driverClassName" value = "$ {master.jdbc.driverclass}"/> <propriedade name = "url" value = "$ {master.jdbc.url}"/> <nome da propriedade = "userName") value = "$ {master.jdbc.password}"/> <propriedade name = "filters" value = "stat"/> <nome da propriedade = "maxactive" value = "20"/> <names name = "inicialSize" value = "1"/> <nome da propriedade "" maxwait "" 60000 "/> <nome =" minimle "" "timebetweenEvictionRunSmillis" value = "60000"/> <name da propriedade = "minevictableIdLeTIMEMILLIS" value = "300000"/> <names name = "validationQuery" value = "selecione 'x'"/> <name) value = "false"/> </bean> <bean id = "sqlSessionFactory1"> <propriedade name = "DataSource" ref = "DataSourCemaster"/> <names name = "mapperlocations"> </array> <Value> Classpath: mapper/*xml <ean> </ray> </are> value = "com.isea533.mybatis.mapper"/> <propriedade name = "sqlSessionFactoryBeanName" value = "sqlSessionFactory1"/> </i bean> <bean id = "sqlSessionMaster" scope = "prototype"> <construtor-arg = "0" 0 "0" 0 "0" 0 "sqlsessmaster" scope = "prototype"> <construtor-arg = "0" 0 " <AoP: Pointcut id = "AppService" Expression = "Execution (*com.isea533.mybatis.service ..*Service*. transação-manager = "transactionManager1"> <tx: atributes> <tx: método name = "select*" read -ly = "true"/> <tx: método name = "find*" leitura-somente = "true"/> <tx: name do método = "get*" read-inly = ""/> <t): método "," get*"" " </tx: atributos> </tx: conselhos> <bean id = "transactionManager1"> <propriedade name = "DataSource" ref = "DataSourCemaster"/> </shean> </sieves>Spring-DataSource-Slave.xml
Há pouca diferença entre ele e o mestre, principalmente porque há uma diferença entre o nome do ID e a configuração da fonte de dados.
<Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-nstance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.sringframework.org/schema http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schean idast) Destroy-method = "Close"> <propriedade name = "driverclassName" value = "$ {slave.jdbc.driverclass}"/> <propriedade name = "url" value = "$ {slave.jdbc.url}"/> name = "userName" = "$ {escravo.jdbc.jdc.erl}"/> <nome do nome "username" = "$ {slave.jdb.jdc.erl}"/> <name = "username" = "$ {escravo.jdc.jdc.erl}"/> <nome do nome "/" value = "$ {slave.jdbc.password}"/> <propriedade name = "filters" value = "stat"/> <names name = "maxactive" value = "20"/> <names name = "inicialsize" value = "1"/> <nome da propriedade = "maxwait" "" 60000 "/> <nome =" minimle "" " "timebetweenEvictionRunSmillis" value = "60000"/> <name da propriedade = "minevictableIdLeTIMEMILLIS" value = "300000"/> <names name = "validationQuery" value = "selecione 'x'"/> <name) value = "false"/> </bean> <bean id = "sqlSessionFactory2"> <propriedade name = "DataSource" ref = "DataSourcesLave"/> <Nome da propriedade = "mapperlocations"> </Array> <Value> Classpath: mapper/*xml </value> </array> </are> value = "com.isea533.mybatis.mapper"/> <propriedade name = "sqlSessionFactoryBeanName" value = "sqlSessionFactory2"/> </s Bean> <bean id = "sqlSessionsLave" scope = "prototype"> <constructor-arg index = "0" 0 " <aop: config> <aOP: Pointcut id = "AppService" Expression = "Execution (*com.isea533.mybatis.service ..*Service*.*(..))"/> <AOP: Advisor Advice-ref = "txadvice2" Point-ref = "AppSice" "/> transação-manager = "transactionManager2"> <tx: atributos> <tx: método name = "*" leitura somente = "true"/> </tx: atributes> </tx: conselhos> <bean id = "transactionManager2"> <nome da propriedade = "datasource" ref = "datasourcesLave"/*Deve-se notar aqui que <tx: método name = "*" leitura somente = "true"/> é somente leitura. Se não for uma biblioteca de escravos, você pode configurá -la de acordo com a biblioteca principal.
No código a seguir:
<Bean> <Propriedade name = "BasEpackage" value = "com.isea533.mybatis.mapper"/> <propriedade name = "sqlSessionFactoryBeanName" value = "sqlSessionFactory2"/> </i Bean>
Diferentes SQLSessionFactory deve ser especificado através do SQLSessionFactoryBeanName.
config.properties
# Configuração do banco de dados - mastermaster.jdbc.driverclass = com.mysql.jdbc.drivermaster.jdbc.url = jdbc: mysql: //192.168.1.11: 3306/testmaster.jdbc.uSer = rootmaster.jdbsbc.pass. com.mysql.jdbc.driverslave.jdbc.url = jdbc: mysql: //192.168.1.22: 3306/testslave.jdbc.user = rootslave.jdbc.password = jj
Usando mapeador
Isso está definido para a situação de mestre e escravo. Os dois mapeadores de varredura de configuração são os mesmos, portanto não podem ser injetados diretamente, portanto, precisam ser injetados através do método problemático abaixo.
@ServicePublic Class Demoservice {Pountador privado Writemapper; Readmapper de compatriota privado; @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 (país do país) {return writemapper.insert (país); } Lista pública <Country> SelectPage (int pagenum, int PageSize) {PageHelper.StartPage (Pagenum, PageSize); return readmapper.select (nulo); }}Como o SQLSession pode ser distinguido pelo nome, recebemos o mapeador do SQLSession.
Além disso, se você precisar considerar ao escrever e ler na mesma transação, precisará usar o mesmo Writemapper para que os dados mais recentes da transação possam ser obtidos ao ler.
O exposto acima é a situação do mestre e escravo.
No caso da partição da biblioteca, como os mapeadores diferentes estão sob diferentes pacotes, você pode injetar diretamente o mapeador usando @Resource ou @Autowired, e não há necessidade de obtê -lo através do SQLSession.
Este artigo é apenas uma referência para várias fontes de dados. Por favor, considere -o de acordo com sua própria situação ao aplicá -la na prática.
No futuro, usarei meu tempo livre para tentar desenvolver plug-ins que possam alternar automaticamente as fontes de dados com base neste artigo e nos dois links relacionados acima para várias fontes de dados MySQL. Como não estou muito familiarizado com a aplicação prática nessa área, agradeço a todos que deixem uma mensagem para compartilhar suas próprias soluções. Quanto mais eu conheço sobre isso, maior a probabilidade de desenvolver um plug-in geral de comutação de fonte de dados.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.