spring 读写分离数据源的配置,springboot 自定义数据源
00-1010对于设备库,我们首先创建一个数据库连接配置类,将配置文件中的读写数据源添加到类中,创建返回SqlSessionFactory的Bean,创建SqlSessionTemplate的Bean,创建DataSourceTransactionManager事务管理器,最后,我们可能会遇到一个这个项目需要配置多个数据源,或者需要配置读写分离。在启动类上粘贴@MapperScan注释来指定要扫描的对应mapper.xml文件,孙晓慧,不能满足这一点。我们可以通过定制配置数据库的配置类来解决这个问题。方式很多,不同的商家采用不同的方式。在这里,我简单介绍一下如何使用我们的项目。
比如项目中,我需要连接两个数据库,opretion和device,读写要分开。配置文件如下所示:
目录
@ Configuration @ mapper scan(base packages={ com . liqing . my . repo . device },Sqlsessiontemplateref= devicesqlsessiontemplate )公共类devicedsconfig { @ value( $ { props . SQL . show } )//配置文件中定义的字段tureperivate string SQL show}@MapperScan
base packages={ com . liqing . my . repo . device }
指定包扫描
sqlSessionTemplateRef= deviceSqlSessionTemplate )
指定sqlSessionTemplateRef
针对device库我们先创建一个数据库连接配置类
@ configuration properties(prefix= spring . sharding sphere . data source . device . read )公共数据源devicereaddata source(){ return new druid data source();} @Bean @ConfigurationProperties(前缀= spring . sharding sphere . data source . device . write )公共数据源devicewritedata source(){ return new druid data source();}@ConfigurationProperties批注与@Value相似,它用于获取配置文件中相应的配置值。但是,@ConfigurationProperties与@Value不同,因为@Value一次只能获取一个值,而@ConfigurationProperties可以获取多个值。这里,配置文件中的属性可以自动封装到DruidDataSource的属性中。
配置分片数据源的Bean,即device.read和device.write读写分离的数据源
使用@Qualifier批注指定我们希望deviceReadDataSource方法返回的bean,即获取deviceReadDataSource方法返回的DruidDataSource对象,deviceWriteDataSource也是如此。
负载平衡策略配置是实现我们负载平衡的策略。
通过MasterSlaveRuleConfiguration构造方法实现了一种定制的负载均衡算法。
@ Bean公共数据源devicesharedingdata source(@ Qualifier( devicereadDataSource )data source readDataSource,//使用devicereaddata source指定Bean返回的read data source对象@Qualifier(deviceWriteDataSou
rce") DataSource writeDataSource) throws SQLException { Map<String, DataSource> dataSourceMap = new HashMap<>(); dataSourceMap.put("device-read", readDataSource); dataSourceMap.put("device-write", writeDataSource); //Spring负载均衡自动配置类 LoadBalanceStrategyConfiguration LoadBalanceStrategyConfiguration loadBalanceStrategyConfiguration = new LoadBalanceStrategyConfiguration("round_robin"); //负载均衡算法 MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration( "device_read_write", "device-write", Lists.newArrayList("device-read"), loadBalanceStrategyConfiguration); Properties properties = new Properties(); properties.setProperty("sql.show", sqlShow); return MasterSlaveDataSourceFactory.createDataSource(dataSourceMap, masterSlaveRuleConfig, properties); //返回一个DataSource}
创建返回SqlSessionFactory的Bean
1、创建MybatisSqlSessionFactoryBean
对象配置SqlSessionFactory;
2、创建MybatisConfiguration
对象调用setMapUnderscoreToCamelCase方法,开启mapUnderscoreToCamelCase配置驼峰转换
3、创建GlobalConfig
对象出传入MybatisConfiguration对象设置关闭对应banner(可以选择不关,但是利于查看日志和控制台)
4、通过ResourcePatternResolver
资源模式解析器,配置mapper.xml的文件路径
@Bean@Primary //在同样的DataSource中,首先使用被标注的SqlSessionFactorypublic SqlSessionFactory deviceSqlSessionFactory(@Qualifier("deviceShardingDataSource") DataSource shardingDataSource) { MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); bean.setDataSource(shardingDataSource); //设置 MybatisSqlSessionFactory的数据源 //MyBatis开启mapUnderscoreToCamelCase配置驼峰转换 MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setMapUnderscoreToCamelCase(true); GlobalConfig globalConfig = GlobalConfigUtils.getGlobalConfig(configuration); globalConfig.setBanner(false); //关闭Mybatis 加载的banner bean.setGlobalConfig(globalConfig); bean.setConfiguration(configuration); // 添加XML目录 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //资源模式解析器 try { bean.setMapperLocations(resolver.getResources("classpath:mapper/device/**/*Mapper.xml")); //设施设置mapper映射器位置 return bean.getObject(); //返回一个SqlSessionFactorypo } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); }}
题外话:默认情况下,@Autowired
按类型装配 Spring Bean。如果容器中有多个相同类型的 bean,则框架将抛出NoUniqueBeanDefinitionException
, 以提示有多个满足条件的 bean 进行自动装配。程序无法正确做出判断使用哪一个,所以会报错,可以使用@Primary和@Qualifier注解类解决这类问题
通过将
@Qualifier
注解与我们想要使用的特定 Spring bean 的名称一起进行装配,Spring 框架就能从多个相同类型并满足装配要求的 bean 中找到我们想要的@Primary
的解,可以用来发生依赖注入的歧义时决定要注入哪个 bean。当存在多个相同类型的 bean 时,此注解定义了Bean的首选项。简单来说就是@Qualifier注解那多个Bean指定了我要那个Bean,而@Primary注解表示那个多个Bean,先选贴了@Primary注解的Bean
创建SqlSessionTemplate的Bean
方法名要与类名上@MapperScan注解中的sqlSessionTemplateRef属性值一致;否者无法映射
SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。
@Bean@Primarypublic SqlSessionTemplate deviceSqlSessionTemplate(@Qualifier("deviceSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory);}
创建DataSourceTransactionManager 事务管理器
@Bean@Primarypublic DataSourceTransactionManager deviceTransactionManager(@Qualifier("deviceShardingDataSource") DataSource shardingDataSource) { return new DataSourceTransactionManager(shardingDataSource);}
到此,我们的配置基本结束,根据我们配置的mapper包扫描下创建对应的mapper接口,
在resource目录下根据我们在配置类中配置的路径存放即可;
最后
注意:这是一个数据源的案例,当是需要配置多个数据源的时候,流程是一样的
1.在配置文件中配置数据库连接数据
2.创建配置类
3.创建mapper接口和mapper.xml文件
到此这篇关于SpringBoot多数据源读写分离的自定义配置问题及解决方法的文章就介绍到这了,更多相关SpringBoot多数据源自定义配置内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。