Spring AOP, a configuração do MySQL Master-Slave realiza a separação de leitura e gravação. Em seguida, registre seu próprio processo de configuração e problemas encontrados para facilitar a próxima operação. Eu também espero ajudar alguns amigos.
1. Use o mecanismo de interceptação da Spring AOP para realizar a seleção dinâmica de fontes de dados.
importar java.lang.annotation.ElementType; importar java.lang.annotation.target; importar java.lang.annotation.retention; importar java.lang.annotation.retEntionPolicy; /** * Tempo de execução * O compilador gravará os comentários no arquivo de classe, e a VM manterá os comentários no tempo de execução, para que possa ser lido com reflexivamente. * @author yangguang * */ @retention (retentionpolicy.runtime) @target (elementType.method) public @Interface DataSource {String value (); } 3. Use o abstractroutingDataSource da Spring para resolver o problema de várias fontes de dados
importar org.springframework.jdbc.dataSource.lookup.abstractroutingDataSource; classe pública ChoosedataSource estende abstractroutingDataSource {@Override Protected Object DetermineCurrentLookKey () {return handleDataSource.getDataSource (); }} 4. Use Threadlocal para resolver problemas de segurança de threads
classe pública Handledatasource {public static final threadlocal <string> holder = new Threadlocal <string> (); public static void putdataSource (string datAsource) {holder.set (DataSource); } public static string getDataSource () {return holder.get (); }}5. Defina uma classe de faceta de origem de dados, acessada através da AOP e está configurada no arquivo de configuração da primavera, para que nenhuma anotação AOP seja usada.
importar java.lang.reflect.method; importar org.aspectj.lang.joinpoint; importar org.aspectj.lang.annotation.aspect; importar org.aspectj.lang.annotation.be antes; importar org.aspectj.lang.annotation.pointcut; importar org.aspectj.lang.reflect.methodSignature; importar org.springframework.tereotype.component; //@aspecto //@componente classe pública DataSourCeaspect {//@Pointcut ("Execution (*com.apc.cms.service.*.*(..)") public void Pointcut () {}; // @Before (value = "Pointcut ()") public void antes (ponto de jointPoint) {Object Target = Point.getTarget (); System.out.println (Target.ToString ()); String métod = Point.getSignature (). GetName (); System.out.println (método); Classe <?> [] Classz = Target.getClass (). GetInterfaces (); Classe <?> [] ParameterTypes = ((MethodSignature) Point.getSignature ()) .getMethod (). GetParameterTypes (); tente {método m = classz [0] .getMethod (método, parameterTypes); System.out.println (m.getName ()); if (m! = null && m.isannotationPresent (DataSource.class)) {DataSource Data = m.getannotation (DataSource.class); HandledataSource.putDataSource (data.value ()); }} catch (Exceção e) {e.printStackTrace (); }}}6. Configure o ApplicationContext.xml
<!-fonte de dados da biblioteca principal-> <bean id = "writedataSource" destrow-method = "close"> <propriedade name = "driverclass" value = "com.mysql.jdbc.driver"/> <names = "jdbcurl" value "" jdbc:/mysql: //172.22.22.22.10.6: name = "nome de usuário" value = "root"/> <propriedade name = "senha" value = "root"/> <propriedade name = "partitionCount" value = "4"/> <names name = "releaseHelPerThreads" value = "3"/> <namesper (adquirirEnCrement "value" 2 "/> <propriedades/" name = "minconnectionSperPartition" value = "20"/> <propriedade name = "idlemaxageInseconds" value = "60"/> <propriedade name = "idleConnectionTestPeriodInsOnds" value = "60"/> <nome da propriedade = "poolAVAILATILIDADE" = "5"/> </bean> <! Destroy-method = "Close"> <propriedade name = "driverclass" value = "com.mysql.jdbc.driver"/> <propriedade name = "jdbcurl" value = "jdbc: mysql: //172.22.14.7: 3306/cpp? value = "root"/> <propriedade name = "partitionCount" value = "4"/> <propriedade name = "releaseHelPerThreads" value = "3"/> <names name = "adquirroincrement" value = "2"/> <propriedades name = "maxConnectionSpertortição" value = "40"/> <weead = "MinConnectionsPert"/"4) name = "idlemaxageInseconds" value = "60"/> <propriedade name = "IdleConnectionTestPeriodInseConds" value = "60"/> <propriedades name = "Poolavilabilitythreshold" Value = "5"/> </bean> <!-gerenciador de transação, gerenciamento de transação-> <Bean id = "" transmanager " < /bean> <!-anotação-carregamento-> <Contexto: Anotação-Config /> <!-ENALE Vcanning de componentes (cuidado com que isso não permita a varredura de mapeador!)-> <Contexto: component-Scan-Package = "com.apc.cms.persistence.rdbms" /> <contexten: <Contexto: incluir filtro type = "anotação" expressão = "org.springframework.steretype.component" /> < /context: component-scan> <Contexto: componente-scan-package = "com.apc.cms.auth" /> <!-Enable Demarcation with AnnoTations-<tq): id = "sqlSessionFactory"> <propriedade name = "dataSource" ref = "dataSource" /> <propriedade name = "typeAliasespackage" value = "com.apc.cms.model.domain" /> < /bean> <!-Scan para mapeadores e deixe-os ser autorregudizados-> <Bean> <tean> /> <propriedade name = "sqlsessionFactory" ref = "sqlSessionFactory" /> </i bean> <bean id = "dataSource"> <propriedade name = "TargetDataSources"> <map key-type = "java.lang.string"> <!-write-> <entrada) <br Writ-ref) key = "leia" value-ref = "readDataSource"/> </map> </propriedade> <propriedade name = "defaultTargetDataSource" ref = "writedataSource"/> </bean> <!-ativar a função automática de proxy-> <aop: ascestj-autoproxy! <bean id = "DataSourCeaspect"/> <AOP: config> <aOP: aspecto id = "c" ref = "datasourceaspect"> <aop: pointcut id = "tx" expressão = "Execution (*com.apc.cms.service ..*. </aOP: config> <!-Configure anotação de banco de dados AOP->
7. Use anotações para selecionar dinamicamente a fonte de dados e ler a biblioteca e escrever a biblioteca, respectivamente.
@DataSource ("write") public void update (usuário do usuário) {userMApper.Update (Usuário); } @DataSource ("Read") Public Document GetDocbyId (Long ID) {return DocumentMapper.getById (ID); } Operação de gravação de teste: você pode modificar os dados através do aplicativo e modificar os dados principais da biblioteca. Você descobrirá que os dados na biblioteca de escravos foram atualizados de maneira síncrona, de modo que as operações de gravação definidas estão todas escritas na biblioteca.
Operação de leitura de teste: Modificar os dados do banco de dados escravos em segundo plano, verifique se os dados no banco de dados principal não foram modificados, atualize na página de aplicativos e descobre que os dados no banco de dados de escravos são lidos, o que significa que a separação de leitura e gravação está OK.
Resumo dos problemas encontrados:
Pergunta 1: O projeto é um projeto maven e o mecanismo da Spring AOP é usado. Além dos pacotes principais de jar da primavera, os pacotes JAR que precisam ser usados são as aspectosj.jar, aspecjweaver.jar e aOpalliance.jar. Verifique o POM no projeto e consulte que o pacote de dependência está faltando. Como o repositório local não possui esses frascos, procure a Biblioteca Central do MAVEN que possa fornecer o download do pacote JAR, configure -o no Maven e atualize automaticamente:
<Repositório> <ID> Nexus </dod> <name> nexus </name> <url> http://repository.sonatype.org/content/groups/public/ </erl> <layout> padrão </sayout> </positório>
Os frascos que dependem para configurar o projeto estão perdendo principalmente esses dois.
<Ependency> <voundiD> aspecto </groupiD> <TRORFACTID> AspectJrt </ArtifactId> <versão> 1.5.4 </version> </dependency> <pendence> <purpiD> aspecto </groupid> </ArtifactId> ascepjweaver </stifactId> <Versão> 1.5.4 </versão> lt; Lt;
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.