Basicamente, os artigos na Internet têm apenas várias fontes de dados ou apenas fontes dinâmicas de dados, enquanto projetos recentes precisam usar dois métodos ao mesmo tempo. Vamos gravar os métodos de configuração para sua referência.
Cenários de aplicação
O projeto precisa conectar dois bancos de dados diferentes A e B ao mesmo tempo, e ambos são arquiteturas de escravos mestres, uma biblioteca de gravação e várias bibliotecas de leitura.
Múltiplas fontes de dados
Primeiro, você deve desativar o DataSourCeautoconfiguration que vem com a Spring Boot, porque ela lerá o Spring.DataSource. Basta adicionar o atributo exclude à anotação @springbootApplication:
@Springbootapplication (exclude = {DataSourCeautoconfiguration.class}) classe public titanwebApplication {public static void main (string [] args) {springapplication.run (titanwebApplication.class, args); }}Em seguida, configure as informações de conexão de origem de vários dados no Application.properties:
# Biblioteca Titan spring.dataSource.titan-master.url = jdbc: mysql: // xxxx: port/titan? caracterencoding = utf-8spring.datasource.titan-master.u Sername = spring.datasource.titan-master.password = spring.dataSource.titan-master.driver-class-name = com.mysql.jdbc.driver# Configuração do pool de conexão# omita# Outras bibliotecas spring.dataSource.db2.url = jdbc: mysql: // xxxx: port/titan2? caracterencoding = utf-8spring.dataSource.db2.Username = spring.dataSource.db2.password = spring.datasource.db2.dlass-class-name
Como desativamos a configuração automática da fonte de dados, precisamos criar manualmente essas fontes de dados na próxima etapa:
@ConfigurationPublic Classe DataSourceConfig {@Bean (name = "titanMasterds") @configurationproperties (prefix = "spring.datasource.titan-master") // prefixo da propriedade correspondente no aplicativo.Properteis public DataSource DataSource1 (). } @Bean (name = "ds2") @configurationproperties (prefix = "spring.dataSource.db2") // prefixo da propriedade correspondente no aplicativo.properteis public DataSource DataSource2 () {return datasourcebuilder.create (). }}Em seguida, você precisa configurar dois Mybatis SQLSessionFactory para usar diferentes fontes de dados:
@Configuration @MappersCan (BasEpackages = {"titan.mapper"}, sqlSessionFactoryRef = "SQLSessionFactory1") classe pública mybatisdbaconfig {@autowired @qualifier ("titanMasterds) privado datasource ds1;; @Bean public SQLSessionFactory SQLSessionFactory1 () lança Exceção {SQLSessionFactoryBean FactoryBean = new SQLSessionFactoryBean (); FactoryBean.SetDataSource (DS1); // Use a fonte de dados Titan para conectar -se à biblioteca Titan retornar FactoryBean.getObject (); } @Bean public sqlSessionTemplate sqlSessionTemplate1 () lança Exceção {sqlSessionTemplate modelo = new SQLSessionTemplate (sqlSessionFactory1 ()); // Use a fábrica configurada acima para retornar o modelo; }}Após a configuração acima, a interface do Mapper em Titan.mapper usará a fonte de dados do Titan. Da mesma forma, você pode usar o segundo SQLSessionFactory:
@Configuration @MapperScan (BasEpackages = {"Other.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory2") classe pública mybatisdbbconfig {@autowired @qualifier ("ds2") private DataSource DS2; @Bean public SQLSessionFactory SQLSessionFactory2 () lança Exceção {sqlSessionFactoryBean FactoryBean = new SQLSessionFactoryBean (); FactoryBean.SetDataSource (DS2); return factorybean.getObject (); } @Bean public sqlSessionTemplate sqlSessionTemplate2 () lança Exceção {sqlSessionTemplate modelo = new SQLSessionTemplate (sqlSessionFactory2 ()); modelo de retorno; }}Depois de concluir essas configurações, suponha que haja 2 mapen titan.mapper.userMapper e outros.mapper.rolemapper. Ao usar o primeiro, a Biblioteca Titan será conectada automaticamente e a última será conectada à biblioteca DS2.
Fontes de dados dinâmicas
A intenção original de usar fontes dinâmicas de dados é poder separar a leitura e a gravação na camada de aplicativos, ou seja, para controlar diferentes métodos de consulta no código do programa para se conectar a diferentes bibliotecas. Além deste método, o middleware do banco de dados também é uma boa escolha. Sua vantagem é que o cluster do banco de dados está exposto apenas a uma única biblioteca para o aplicativo e não precisa alternar a lógica do código da fonte de dados.
Realizamos a troca dinâmica da fonte de dados através de anotações personalizadas + AOP.
Primeiro, defina um contestador para salvar o nome da fonte de dados usado pelo thread atual:
classe pública DataSourceContextholder {public static final logger log = loggerFactory.getLogger (DataSourceContextholder.class); / *** fonte de dados padrão*/ public static final string default_ds = "titan-mestre"; private estático final threadlocal <string> contextholder = new ThreadLocal <> (); // Defina o nome da fonte de dados public static void SetDB (String dbtype) {log.debug ("alterne para {} fonte de dados", dbtype); contextholder.set (dbtype); } // Obtenha o nome da fonte de dados public static string getdb () {return (contextholder.get ()); } // limpe o nome da fonte de dados public static void cleardb () {contextholder.remove (); }}Em seguida, personalize a implementação da interface javax.sql.datasource. Aqui você só precisa herdar a classe pai abstractrotingDataSource que a primavera implementou para nós com antecedência:
classe pública DynamicDataSource estende o abstractroutingDataSource {Private Static Final Logger Log = LoggerFactory.getLogger (DynamicDataSource.class); @Override Protected Object DetermineCurrentLeoveKey () {Log.Debug ("Data Source Is {}", DataSourceContextholder.getDB ()); Retornar DataSourceContextholder.getdb (); }}Crie fontes de dados dinâmicas:
/ *** Fonte de dados dinâmicos: comutação dinâmica entre diferentes fontes de dados através da AOP* @return*/ @Bean (name = "dynamicds1") public DataSource DataSource () {DynamicDataSource DynamicDataSource = new DynamicDatasource (); // fonte de dados padrão DynamicDataSource.SetDefaultTargetDataSource (DataSource1 ()); // Configure mapa de origem multi-dados <objeto, objeto> dsmap = new Hashmap (5); dsmap.put ("Titan-mestre", DataSource1 ()); dsmap.put ("DS2", DataSource2 ()); DynamicDataSource.SetTargetDataSources (DSMAP); retornar dynamicDataSource; }Anotação personalizada @DS é usada para especificar qual fonte de dados o método usa ao codificar:
@Retention (retentionpolicy.runtime) @target ({elementType.method}) public @Interface ds {string value () padrão "titan-mestre";}Escreva seções AOP para implementar a lógica de comutação:
@Aspecto@componentpublic class dynamicdatasourceaspect {@before ("@anotação (ds)") public void beforeswitchds (ponto de junta) {// obtenha a classe de acesso atual <?> ClassName = Point.getTarget (). GetClass (); // obtenha o método de acesso Nome String MethodName = Point.getSignature (). GetName (); // Obtenha o tipo de parâmetro da classe de método [] argClass = ((MethodSignature) Point.getSignature ()). GetParameterTypes (); String dataSource = DataSourceContextholder.default_ds; tente {// O objeto Método acessado é método Method = ClassName.getMethod (MethodName, ArgClass); // Determine se a anotação @DS existe se (Method.isannotationPresent (ds.class)) {DS anotação = Method.getAnnotation (ds.class); // Retire o nome da fonte de dados no conjunto de dados de anotação = anotação.value (); }} catch (Exceção e) {e.printStackTrace (); } // Alterne a fonte de dados DataSourceContextholder.SetDB (DataSource); } @After (" @annotation (ds)") public void depoiswitchds (ponto de junta) {DataSourceContextholder.cleardb (); }}Após concluir a configuração acima, especificando o DynamicDataSource na configuração anterior do SQLSessionFactory para usar o DynamicDataSource para alternar com prazer as fontes de dados no Serviço:
@AUTOWIRED PRIVADO UseramodelMapper UserApApper; @Ds ("titan-mestre") public string ds1 () {return userApApper.SelectByPrimaryKey (1) .getName (); } @Ds ("ds2") public string ds2 () {return userApApper.selectByPrimaryKey (1) .getName (); }Resumir
O acima exposto é o método de configuração de fonte de dados de dados e fonte de dados dinâmicos de mybatis e mybatis introduzido pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!