解锁无限可能:使用SpringBoot和MyBatis打造动态数据源

今天分享一个利用SpringBoot和Mybatis实现动态加载数据源的解锁过程,可以达到服务不停机迁移数据源的无限目的,废话不多说直接上代码。使用数据
首先 你需要在application.properties或application.yml文件中配置一个数据源的打造动态连接信息-用于存储配置信息,类似于以下示例: 复制# 主数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/test_test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver1.2.3.4.5. 接下来,解锁创建一个DataSourceDynamicConfig类来配置多个数据源 复制@Configuration @ConditionalOnClass(value = {DataSource.class}) public class DataSourceDynamicConfig { String DEFAULT = "default"; @ConfigurationProperties(prefix = "spring.datasource") @Bean("defaultDataSource") public DataSource setDefault(){ return DataSourceBuilder.create() .type(DruidDataSource.class).build(); } @Bean public DynamicDataSource dynamicDataSource(@Qualifier("defaultDataSource") DataSource defaultDataSource) { Map<Object,无限 Object> targetDataSources = new HashMap<>(); targetDataSources.put(DEFAULT, defaultDataSource); DynamicDataSource dataSource = new DynamicDataSource(); dataSource.setDataSources(targetDataSources); dataSource.setDefaultTargetDataSource(defaultDataSource); DataSourceContextHolder.setDataSourceName(DEFAULT); return dataSource; } @Bean public SqlSessionFactory sqlSessionFactory(DynamicDataSource dataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true); return factoryBean.getObject(); } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.在上述代码中,我们使用@ConfigurationProperties注解将不同数据源的站群服务器使用数据配置注入到DataSource实例中。然后,打造动态我们创建一个DynamicDataSource实例。解锁我们使用targetDataSources属性来存储所有数据源,无限每个数据源都有一个标识符。使用数据defaultTargetDataSource属性指定默认的打造动态数据源。
接下来,解锁我们需要创建一个DynamicDataSource类来实现动态切换数据源。无限以下是免费源码下载使用数据一个简化的示例: 复制public class DynamicDataSource extends AbstractRoutingDataSource { // 存储所有数据源 private static Map<Object, Object> dataSources = new HashMap<>(); public void setDataSources(Map<Object, Object> sources){ this.setTargetDataSources(sources); dataSources = sources; } @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceName(); } // 动态添加数据源 public static void setDataSource(String key,DataSource dataSource){ dataSources.putIfAbsent(key,dataSource); } protected DataSource determineTargetDataSource() { String dataSourceName = determineCurrentLookupKey().toString(); DataSource dataSource = (DataSource) dataSources.get(dataSourceName); if (dataSource == null) { throw new IllegalStateException("DataSource " + dataSourceName + " is not configured"); } return dataSource; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33. 复制//存储当前线程数据源 public class DataSourceContextHolder { private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>(); public static void setDataSourceName(String name){ CONTEXT_HOLDER.set(name); } public static String getDataSourceName(){ return CONTEXT_HOLDER.get(); } public static void clearDataSourceName(){ CONTEXT_HOLDER.remove(); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18. 添加一个数据实体,用于接收动态数据源。 复制@Data @AllArgsConstructor @NoArgsConstructor public class DataSourceEntity { String url; String userName; String pwd; String driverClassName; }1.2.3.4.5.6.7.8.9.10.11.12.13. 接下来构造点模拟数据。准备数据测试数据表语句。
复制create database test_test; CREATE TABLE `t_t` ( `id` int DEFAULT NULL, `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT=test1.2.3.4.5.插入两个数据库测试数据。
复制## test_test INSERT INTO test_test.t_t (id, name) VALUES(1, test_test); ## full_dev INSERT INTO test_test.t_t (id, name) VALUES(1, full_dev);1.2.3.4.5.6.7.8.创建一个查询TestMapper类。
复制@Mapper public interface TestMapper { @Select("select * from t_t") Map<String,Object> selectMap(); }1.2.3.4.5.6.7.创建SpringBoot Main函数。
复制@SpringBootApplication @MapperScan(basePackages = {"com.xlc.common.datasource.mapper.test"}) public class Main { public static void main(String[] args) { SpringApplication.run(Main.class,args); } }1.2.3.4.5.6.7. 最后 单元测试。 复制@SpringBootTest(classes = Main.class) @RunWith(SpringRunner.class) public class TestApp { String userName = "root"; String pwd = "root"; String url = "jdbc:mysql://192.168.15.130:32691/test_test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false"; String driver = "com.mysql.cj.jdbc.Driver"; @Resource TestMapper testMapper; @Before public void before(){ DataSource dataSource = DataSourceBuilder.create() .url(url) .username(userName) .password(pwd) .driverClassName(driver) .build(); DynamicDataSource.setDataSource("hhh",dataSource); } @Test public void t2(){ System.out.println(JSONUtil.toJsonStr(testMapper.selectMap())); DataSourceContextHolder.setDataSourceName("hhh"); System.out.println(JSONUtil.toJsonStr(testMapper.selectMap())); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.运行结果:

本文地址:http://www.bzuk.cn/news/11f9299896.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。