springboot+mybatis多数据源配置

其实不须要配置多数据源,每一个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
  • 配置不一样数据源和SqlSessionFactory

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;
	}

}
  • 经过Map管理不一样数据源的SqlSessionFactory

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();
		}
相关文章
相关标签/搜索