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();
		}
相關文章
相關標籤/搜索