怎么找人做网站啊,商城手机网站开发,唐山 网站建设,关于做甜品的网站多数据源(数据源进行切换)
AbstractRoutingDataSource 根据用户定义的规则选择当前的数据源#xff0c;这样我们可以在执行查询之前#xff0c;设置使用的数据源。实现可动态路由的数据源#xff0c;在每次数据库查询操作前执行。它的抽象方法 determineCurrentLookupKey()…多数据源(数据源进行切换)
AbstractRoutingDataSource 根据用户定义的规则选择当前的数据源这样我们可以在执行查询之前设置使用的数据源。实现可动态路由的数据源在每次数据库查询操作前执行。它的抽象方法 determineCurrentLookupKey() 决定使用哪个数据源。
1、application.yml中配置多个数据源
# Orderspring.datasource.order.urljdbc:mysql://localhost:3306/seata_order?useUnicodetruecharacterEncodingutf8allowMultiQueriestrueuseSSLfalsespring.datasource.order.usernamerootspring.datasource.order.password123456spring.datasource.order.driver-class-namecom.mysql.cj.jdbc.Driver# Storagespring.datasource.storage.urljdbc:mysql://localhost:3306/seata_storage?useUnicodetruecharacterEncodingutf8allowMultiQueriestrueuseSSLfalsespring.datasource.storage.usernamerootspring.datasource.storage.password123456spring.datasource.storage.driver-class-namecom.mysql.cj.jdbc.Driver# Payspring.datasource.pay.urljdbc:mysql://localhost:3306/seata_pay?useUnicodetruecharacterEncodingutf8allowMultiQueriestrueuseSSLfalsespring.datasource.pay.usernamerootspring.datasource.pay.password123456spring.datasource.pay.driver-class-namecom.mysql.cj.jdbc.Driver
2、主启动类添加注解
SpringBootApplication
MapperScan(com.example.demo.mapper)
3、编写配置类
Getterpublic enum DataSourceKey { /** * Order data source key. */ ORDER, /** * Storage data source key. */ STORAGE, /** * Pay data source key. */ PAY,}
public class DynamicDataSourceContextHolder { private static final ThreadLocalString CONTEXT_HOLDER ThreadLocal.withInitial(DataSourceKey.ORDER::name); private static ListObject dataSourceKeys new ArrayList(); public static void setDataSourceKey(DataSourceKey key) { CONTEXT_HOLDER.set(key.name()); } public static String getDataSourceKey() { return CONTEXT_HOLDER.get(); } public static void clearDataSourceKey() { CONTEXT_HOLDER.remove(); } public static ListObject getDataSourceKeys() { return dataSourceKeys; }} public class DynamicRoutingDataSource extends AbstractRoutingDataSource { Override protected Object determineCurrentLookupKey() { //log.info(当前数据源 [{}], DynamicDataSourceContextHolder.getDataSourceKey()); return DynamicDataSourceContextHolder.getDataSourceKey(); }} Configurationpublic class DataSourceProxyConfig { Bean(originOrder) ConfigurationProperties(prefix spring.datasource.order) public DataSource dataSourceMaster() { return new DruidDataSource(); } Bean(originStorage) ConfigurationProperties(prefix spring.datasource.storage) public DataSource dataSourceStorage() { return new DruidDataSource(); } Bean(originPay) ConfigurationProperties(prefix spring.datasource.pay) public DataSource dataSourcePay() { return new DruidDataSource(); } Bean(name order) public DataSourceProxy masterDataSourceProxy(Qualifier(originOrder) DataSource dataSource) { return new DataSourceProxy(dataSource); } Bean(name storage) public DataSourceProxy storageDataSourceProxy(Qualifier(originStorage) DataSource dataSource) { return new DataSourceProxy(dataSource); } Bean(name pay) public DataSourceProxy payDataSourceProxy(Qualifier(originPay) DataSource dataSource) { return new DataSourceProxy(dataSource); } Bean(dynamicDataSource) public DataSource dynamicDataSource(Qualifier(order) DataSource dataSourceOrder, Qualifier(storage) DataSource dataSourceStorage, Qualifier(pay) DataSource dataSourcePay) { DynamicRoutingDataSource dynamicRoutingDataSource new DynamicRoutingDataSource(); MapObject, Object dataSourceMap new HashMap(3); dataSourceMap.put(DataSourceKey.ORDER.name(), dataSourceOrder); dataSourceMap.put(DataSourceKey.STORAGE.name(), dataSourceStorage); dataSourceMap.put(DataSourceKey.PAY.name(), dataSourcePay); dynamicRoutingDataSource.setDefaultTargetDataSource(dataSourceOrder); dynamicRoutingDataSource.setTargetDataSources(dataSourceMap); DynamicDataSourceContextHolder.getDataSourceKeys().addAll(dataSourceMap.keySet()); return dynamicRoutingDataSource; } Bean ConfigurationProperties(prefix mybatis-plus) // MybatisSqlSessionFactoryBean中有各种MybatisPlus的配置属性(globalConfig、mapperLocations} 而SqlSessionFactoryBean中则是mybatis的各种配置属性(typeAlies、mapperLocations) public MybatisSqlSessionFactoryBean sqlSessionFactoryBean(Qualifier(dynamicDataSource) DataSource dataSource) { // 这里用 MybatisSqlSessionFactoryBean 代替了 SqlSessionFactoryBean否则 MyBatisPlus 不会生效 MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean new MybatisSqlSessionFactoryBean(); mybatisSqlSessionFactoryBean.setDataSource(dataSource); return mybatisSqlSessionFactoryBean; }}
调用切换数据源
GlobalTransactionalOverridepublic OperationResponse placeOrder(PlaceOrderRequestVO placeOrderRequestVO) throws Exception { DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.ORDER);//切换数据源 Integer amount 1; Integer price placeOrderRequestVO.getPrice(); Order order Order.builder().build(); Integer saveOrderRecord orderDao.insert(order); // 扣减库存 boolean operationStorageResult storageService.reduceStock(placeOrderRequestVO.getProductId(), amount); // 扣减余额 boolean operationBalanceResult payService.reduceBalance(placeOrderRequestVO.getUserId(), price); DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.ORDER);//切换数据源 order.setStatus(OrderStatus.SUCCESS); Integer updateOrderRecord orderDao.updateById(order); return success(operationStorageResult operationBalanceResult);} 项目启动报错Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured
原因导入spring-mybatis依赖后springboot启动时会自动加载数据源由于dataSource配置成多数据源加载不到spring.datasource.url故而报错。
解决1、主启动类添加SpringBootApplication(exclude DataSourceAutoConfiguration.class)
2、若上面配置还是无法解决可以配置一个默认数据源让其启动时加载(不影响,会被多数据源切换时覆盖的)spring.datasource.url 额外
SqlSessionFactory factorynew SqlSessionFactoryBuilder().build(in);
SqlSession sqlSessionfactory.openSession(); //sqlSession就是用来操作sql语句的
使用 MyBatis-Spring 之后, 会使用SqlSessionFactoryBean来代替SqlSessionFactoryBuilder创建SqlSessionFactory
MybatisPlus需要使用MybatisSqlSessionFactoryBean。