其實不須要配置多數據源,每一個application配置一個slave庫,經過nginx分發請求到application就更簡單了。本文基於讀操做,隨機從多個slave庫中讀取數據。java
datasource.master.url=jdbc:mysql://127.0.0.1:3306/db1 datasource.master.driverClassName=com.mysql.jdbc.Driver datasource.master.username=root datasource.master.password=root datasource.slave.url=jdbc:mysql://127.0.0.1:3306/db2 datasource.slave.driverClassName=com.mysql.jdbc.Driver datasource.slave.username=root datasource.slave.password=root
package com.datahalt.conf; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; @Configuration public class MultiSqlSessionFactoryConfig { @Bean @Primary @ConfigurationProperties(prefix = "datasource.master") public DataSource dataSourceMaster() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "datasource.slave") public DataSource dataSourceSlave() { return DataSourceBuilder.create().build(); } @Autowired @Qualifier("dataSourceMaster") private DataSource dataSourceMaster; @Autowired @Qualifier("dataSourceSlave") private DataSource dataSourceSlave; @Bean @Primary public SqlSessionFactory masterSqlSessionFactory() throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSourceMaster); // bean.setConfigLocation(new ClassPathResource("DSMybatisConfig.xml")); bean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:com/datahalt/datapicker/sqlmap/*.xml")); return bean.getObject(); } @Bean public SqlSessionFactory slaveSqlSessionFactory() throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSourceSlave); // bean.setConfigLocation(new ClassPathResource("DSMybatisConfig.xml")); bean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:com/datahalt/datapicker/sqlmap/*.xml")); return bean.getObject(); } @Autowired @Qualifier("masterSqlSessionFactory") private SqlSessionFactory masterSqlSessionFactory; @Autowired @Qualifier("slaveSqlSessionFactory") private SqlSessionFactory slaveSqlSessionFactory; @Bean public MultiSqlSessionFactory multiSqlSessionFactory() { MultiSqlSessionFactory m = new MultiSqlSessionFactory(); m.put("master", masterSqlSessionFactory); m.put("slave", slaveSqlSessionFactory); return m; } }
package com.datahalt.conf; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.apache.ibatis.session.SqlSessionFactory; public class MultiSqlSessionFactory { Map<String, SqlSessionFactory> factoryMap = new HashMap<String, SqlSessionFactory>(); ArrayList<String> keyList = new ArrayList<String>(); public void put(String key, SqlSessionFactory value) { factoryMap.put(key, value); keyList.add(key); } public SqlSessionFactory get(String key) { return factoryMap.get(key); } /** * 隨機獲取一個SqlSessionFactory * @return */ public SqlSessionFactory random() { int size = keyList.size(); int num = (int) (Math.random() * 10); int index = num % size; return factoryMap.get(keyList.get(index)); } }
@Autowired MultiSqlSessionFactory multiSqlSessionFactory; SqlSessionFactory toFactory = multiSqlSessionFactory.random(); SqlSession sqlSession = null; try { sqlSession = toFactory.openSession(ExecutorType.BATCH, false); UserMapper mapper = sqlSession.getMapper(UserMapper.class); 。。。 sqlSession.clearCache(); } catch (Exception e) { if (sqlSession != null) sqlSession.rollback(); } finally { if (sqlSession != null) sqlSession.close(); }