当前位置: 首页 > news >正文

公司网站后台是什么免费网线

公司网站后台是什么,免费网线,海尔公司网站建设现状,教学网站建设论文Spring框架提供了多种数据源管理方式,其中多数据源管理是其中之一。多数据源管理允许应用程序使用多个数据源,而不是只使用一个数据源,从而提高了应用程序的灵活性和可靠性。 多数据源管理的主要目的是让应用程序能够在不同的数据库之间切换&…

Spring框架提供了多种数据源管理方式,其中多数据源管理是其中之一。多数据源管理允许应用程序使用多个数据源,而不是只使用一个数据源,从而提高了应用程序的灵活性和可靠性。

多数据源管理的主要目的是让应用程序能够在不同的数据库之间切换,以满足不同的业务需求。例如,如果应用程序需要访问一个高可用性的数据库,但是该数据库当前不可用,那么应用程序可以自动切换到备用数据库,以保证业务的连续性。

在多数据源管理中,Spring框架通过使用JNDI(Java命名和目录接口)来管理数据源。JNDI允许应用程序在运行时动态查找数据源,并且可以使用不同的数据源来访问不同的数据库。

在多数据源管理中,还需要考虑数据源的配置和管理。这包括创建数据源、配置数据源、管理连接池和处理连接泄漏等问题。Spring框架提供了多种数据源配置和管理的工具和技术,例如Spring JDBC Template、Spring Data JPA和Spring Boot等。

总之,多数据源管理是Spring框架中非常重要的一部分,它可以提高应用程序的灵活性和可靠性,从而更好地满足业务需求。

废话少说,直接开干!

下面详细地介绍一下多数据源的实现过程,同时实现一个方法级别的注解,便于灵活使用。

1, Pom配置

引入mysql,spring-boot-starter-jdbc

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>2.4.2</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector.version}</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version>
</dependency>

2,配置数据源

可以在项目里,或者在apollo,nacos等配置中心上

#数据源master
spring.dynamic.datasource.master.url = jdbc:mysql://127.0.0.1:3306/aaa?characterEncoding=utf-8&rewriteBatchedStatements=true&tinyInt1isBit=false&allowMultiQueries=true
spring.dynamic.datasource.master.username = root
spring.dynamic.datasource.master.password = xxxxxxxx
spring.dynamic.datasource.master.driver-class-name = com.mysql.cj.jdbc.Driver
spring.dynamic.datasource.master.type = com.zaxxer.hikari.HikariDataSource#数据源slave
spring.dynamic.datasource.slave.url = jdbc:mysql://127.0.0.1:3306/bbb?characterEncoding=utf-8&rewriteBatchedStatements=true&tinyInt1isBit=false&allowMultiQueries=true
spring.dynamic.datasource.slave.username = root
spring.dynamic.datasource.slave.password = yyyyyyyy
spring.dynamic.datasource.slave.driver-class-name = com.mysql.cj.jdbc.Driver
spring.dynamic.datasource.slave.type = com.zaxxer.hikari.HikariDataSource

3,读取数据源配置

3.1 先看整个项目结构

3.2 新增读取数据源配置类

import lombok.Data;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;import java.util.Map;@Data
@ConfigurationProperties(prefix = "spring.dynamic")
public class DSProperties {private Map<String, DataSourceProperties> datasource;
}

 3.3 新增线程和数据源mapping的类


import com.xxx.gateway.common.Constant;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class DynamicDataSourceHolder {/*** 保存动态数据源名称*/private static final ThreadLocal<String> DYNAMIC_DATASOURCE_KEY = new ThreadLocal<>();/*** 设置/切换数据源,决定当前线程使用哪个数据源*/public static void setDynamicDataSourceKey(String key){log.info("数据源切换为:{}",key);DYNAMIC_DATASOURCE_KEY.set(key);}/*** 获取动态数据源名称,默认使用mater数据源*/public static String getDynamicDataSourceKey(){String key = DYNAMIC_DATASOURCE_KEY.get();return key == null ? Constant.MASTER_DATASOURCE : key;}/*** 移除当前数据源*/public static void removeDynamicDataSourceKey(){log.info("移除数据源:{}",DYNAMIC_DATASOURCE_KEY.get());DYNAMIC_DATASOURCE_KEY.remove();}
}

3.4 继承路由多数据源的抽象类,并实现determineCurrentLookupKey方法

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {String dataBaseType = DynamicDataSourceHolder.getDynamicDataSourceKey();return dataBaseType;}
}

4,根据配置重写数据源和事务管理器

注意: 下面这个注解里的basePackages是你项目的路径

@MapperScan(basePackages = {"com.xxx.gateway.mapper"},
sqlSessionFactoryRef = "SqlSessionFactory")


import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;import java.util.HashMap;
import java.util.Map;@Configuration
@EnableConfigurationProperties(DSProperties.class)
@MapperScan(basePackages = {"com.xxx.gateway.mapper"},sqlSessionFactoryRef = "SqlSessionFactory")
public class DynamicDataSourceConfig {@Bean(name = "dynamicDataSource")public DynamicDataSource DataSource(DSProperties dsProperties) {Map targetDataSource = new HashMap<>(8);dsProperties.getDatasource().forEach((k, v) -> {targetDataSource.put(k, v.initializeDataSourceBuilder().build());});DynamicDataSource dataSource = new DynamicDataSource();dataSource.setTargetDataSources(targetDataSource);return dataSource;}/*** 创建动态数据源的SqlSessionFactory,传入的是动态数据源* @Primary这个注解很重要,如果项目中存在多个SqlSessionFactory,这个注解一定要加上*/@Primary@Bean("SqlSessionFactory")public SqlSessionFactory sqlSessionFactoryBean(DynamicDataSource dynamicDataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dynamicDataSource);org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();configuration.setMapUnderscoreToCamelCase(true);configuration.setDefaultFetchSize(100);configuration.setDefaultStatementTimeout(30);sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));sqlSessionFactoryBean.setConfiguration(configuration);return sqlSessionFactoryBean.getObject();}/*** 重写事务管理器,管理动态数据源*/@Primary@Bean(value = "transactionManager")public PlatformTransactionManager annotationDrivenTransactionManager(DynamicDataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

5,注解实现

5.1 新增注解定义 

import java.lang.annotation.*;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DS {String value() default Constant.MASTER_DATASOURCE;
}

5.2 新增注解实现

import com.xxx.gateway.config.DynamicDataSourceHolder;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Objects;@Aspect
@Order(1)
@Component
@Slf4j
public class DsAspect {@Pointcut("@annotation(com.xgd.gateway.aspect.DS)")public void dsPointCut() {}//环绕通知@Around("dsPointCut()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable{String key = getDefineAnnotation(joinPoint).value();DynamicDataSourceHolder.setDynamicDataSourceKey(key);try {return joinPoint.proceed();} finally {DynamicDataSourceHolder.removeDynamicDataSourceKey();}}/*** 先判断方法的注解,后判断类的注解,以方法的注解为准* @param joinPoint* @return*/private DS getDefineAnnotation(ProceedingJoinPoint joinPoint){MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();DS dataSourceAnnotation = methodSignature.getMethod().getAnnotation(DS.class);if (Objects.nonNull(methodSignature)) {return dataSourceAnnotation;} else {Class<?> dsClass = joinPoint.getTarget().getClass();return dsClass.getAnnotation(DS.class);}}
}

6, 通过注解使用多数据源

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xxx.gateway.aspect.DS;
import com.xxx.gateway.domain.User;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserMapper extends BaseMapper<User> {public User queryByCode(@Param("code") String code);@DS(value="master")public User queryByCodeNoPass(@Param("code") String code);@DS(value="slave1")public List<String> queryBanks();
}

注意:

1,@DS注解里的value值是可以随意的,只要和配置中心里spring.dynamic.datasource.后面的一致就可以。

 2,如果方法上没有配置数据源,那么就是走默认的master数据源,所以项目里必须至少配置了master数据源。

3,各个数据源可以重复,因为不会校验是否重复。

码字不易,记得点赞哟

http://www.yayakq.cn/news/931905/

相关文章:

  • 体检中心网站建设方案电脑建站软件
  • 免费单页网站建设北京诚通新新建设有限公司网站
  • 网站建设和维护需要学的东西百度竞价排名怎么做
  • 局网站建设情况建立网站培训讲义
  • 网站建设需求说明文档企业官网快速建站框架
  • 宁波网站建设服务服务商汽车之家网站开发方案
  • 国外 网站开发框架网站logo尺寸一般多大
  • 蜂蜜网络营销推广方案热狗网站关键词优化
  • iis为网站子目录绑定二级域名网站优化什么意思
  • 确定网站开发团队怎么看网站开发的好坏
  • 网站创建一般创建哪种类型wordpress 文章结尾
  • 常州网站建设方案成品网站能用吗
  • 招聘网站页面设计图片小软件公司一年能挣多少钱
  • 网站设计的工作内容网站开发价格预算
  • 附近做网站的公司电话中国建筑人才网下载
  • php网站源代码wordpress主题百度网盘
  • 佛山网站制作系统网络营销课程设计
  • 建立网站的市场价格棋牌游戏网站建设
  • 网站开发手机app长武网站建设
  • 给公司做网站数据分析如何做微信下单小程序
  • 怎么做让自己的网站河南郑州做网站
  • 网站备案号如何查找wordpress 门户模板
  • 现有的网站开发技术云平台网站开发
  • 怎么样查询网站被挂黑链html5网站模板 站长网
  • 企业网站为什么打不开网站没有地图怎么做的
  • 北京制作网站公司哪家好企业产品做哪个网站推广好
  • 网站模仿侵权工程建设中常见的法律责任有哪些
  • 黑红网站模板平台经济
  • wordpress+整站下载网页搜索的快捷键
  • 网站设计开发团队自己怎么开发社交app软件