一篇搞懂springboot多数据源

news2024/11/17 13:56:10

好文推荐

  • https://zhuanlan.zhihu.com/p/563949762

mybatis 配置多数据源

参考文章

  • https://blog.csdn.net/qq_38353700/article/details/118583828

使用mybatis配置多数据源我接触过的有两种方式,一种是通过java config的方式手动配置两个数据源,另一种方式便是使用mybatis-plus-dynamic。*

总体来说,配置主要包括,产生DataSource,然后是mybatis所需要的SqlSessionFactory,以及配置相应的事务管理器

示例代码

  • pom

            <!--MyBatis整合SpringBoot框架的起步依赖-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.4</version>
            </dependency>
            <!-- Mysql驱动包 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.27</version>
            </dependency>
            <!-- jdbc -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
                <version>2.7.8</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
    
  • 配置文件 yml

    server:
      port: 8080
    
    spring:
      datasource:
        master:
          jdbc-url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave:
          jdbc-url: jdbc:mysql://43.143.217.124:3306/hongbei?characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
          username: root
          password: 123456
          driver-class-name: com.mysql.cj.jdbc.Driver
    
    
    
  • java config 配置数据源一

    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    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 javax.sql.DataSource;
    
    /**
     * @Classname DB1DataSourceConfig
     * @Description DB1DataSourceConfig
     * @Date 2023-02-24 15:14
     * @Created by lihw
     */
    @Configuration
    @MapperScan(
            basePackages = "com.example.demo.mapper.master",
            sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class DB1DataSourceConfig {
    
        String MAPPER_LOCATION = "classpath*:abc/*.xml";
    
        @Primary
        @Bean("masterDataSource")
        @ConfigurationProperties(prefix = "spring.datasource.master")
        public DataSource getMasterDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Primary
        @Bean("masterSqlSessionFactory")
        public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
            // 使用 mybatis plus  配置
            //MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
            //mybatisSqlSessionFactoryBean.setDataSource(dataSource);
            //mybatisSqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
            //        .getResources(MAPPER_LOCATION)); // "classpath:mapping/*Mapper.xml"
            //mybatisSqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.entity");
            //
            //return mybatisSqlSessionFactoryBean.getObject();
    
            // mybatis 配置
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource);
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                  .getResources(MAPPER_LOCATION));
            sqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.entity.master");
    
            org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
            configuration.setMapUnderscoreToCamelCase(true);
    
            sqlSessionFactoryBean.setConfiguration(configuration);
    
            return sqlSessionFactoryBean.getObject();
        }
    
        @Primary
        @Bean("masterSqlSessionTemplate")
        public SqlSessionTemplate  sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
            SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
            return sqlSessionTemplate;
        }
    
        @Bean("masterTransactionManager")
        public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
            DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
            return dataSourceTransactionManager;
        }
    
    
    }
    
    
  • 配置数据源 二

    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    import javax.sql.DataSource;
    
    /**
     * @Classname DB1DataSourceConfig
     * @Description DB1DataSourceConfig
     * @Date 2023-02-24 15:14
     * @Created by lihw
     */
    @Configuration
    @MapperScan(
            basePackages = "com.example.demo.mapper.slave",
            sqlSessionFactoryRef = "slaveSqlSessionFactory")
    public class DB2DataSourceConfig {
    
        String MAPPER_LOCATION = "classpath*:slave/*.xml";
    
        //@Primary
        @Bean("slaveDataSource")
        @ConfigurationProperties(prefix = "spring.datasource.slave")
        public DataSource getSlaveDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        //@Primary
        @Bean("slaveSqlSessionFactory")
        public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
            // mybatis plus配置
            //MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
            //mybatisSqlSessionFactoryBean.setDataSource(dataSource);
            //mybatisSqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
            //        .getResources(MAPPER_LOCATION)); // "classpath:mapping/*Mapper.xml"
            //mybatisSqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.entity");
            //
            //return mybatisSqlSessionFactoryBean.getObject();
    
    
            // mybatis 配置
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource);
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources(MAPPER_LOCATION));
            sqlSessionFactoryBean.setTypeAliasesPackage("com.example.demo.entity.slave");
    
            // 设置mybatis配置
            org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
            // 下划线转驼峰
            configuration.setMapUnderscoreToCamelCase(true);
    
            sqlSessionFactoryBean.setConfiguration(configuration);
    
            return sqlSessionFactoryBean.getObject();
        }
    
        //@Primary
        @Bean("slaveSqlSessionTemplate")
        public SqlSessionTemplate  sqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
            SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
            return sqlSessionTemplate;
        }
    
        @Bean("slaveTransactionManager")
        public DataSourceTransactionManager transactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
            DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
            return dataSourceTransactionManager;
        }
    
    
    }
    
  • 目录结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K95yKTJe-1677467535741)(https://note.youdao.com/yws/res/4010/WEBRESOURCE3a7424410d156d5dc0d6bd00cd7bf638 “image.png”)]

    • 测试接口

      @RestController
      @RequestMapping("/test")
      public class TestController {
      
          @Autowired
          StudentMapper studentMapper;
      
          @Autowired
          SysUserMapper sysUserMapper;
      	// 数据源一 查询
          @GetMapping("list")
          public List<Student> getUserList(){
      
              List<Student> userList = studentMapper.getUserList();
              System.out.println(userList);
      
              return userList;
          }
      	// 数据源二 查询
          @GetMapping("msg2")
          public String getmsg2(){
      
              List<SysUser> user = sysUserMapper.getUserList();
              System.out.println(user);
      
              return "msg22";
          }
      
      }
      

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSCJmOj9-1677467535743)(https://note.youdao.com/yws/res/4016/WEBRESOURCE0cc80d06ca0c483d00bb9e34f16ef10d)]

使用 mybatis-plus-dynamic 配置多数据源

  • pom

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>3.1.1</version>
    </dependency>
    
  • yml

    
    # mybatis-plus-dynamic 配置多数据源
    spring:
      datasource:
        dynamic:
          datasource:
            master:
              url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
              username: root
              password: 123456
              driver-class-name: com.mysql.cj.jdbc.Driver
            slave:
              url: jdbc:mysql://43.143.217.124:3306/hongbei?characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
              username: root
              password: 123456
              driver-class-name: com.mysql.cj.jdbc.Driver
          # 指定主数据库
          primary: master
    
    #mybatis:
    #  mapper-locations: classpath*:abc/*.xml,classpath*:slave/*.xml
    
    mybatis-plus:
      mapper-locations: classpath*:abc/*.xml,classpath*:slave/*.xml
    
    
  • 使用案例

    @Service
    @DS("slave-1")
    public class TbServiceImpl extends ServiceImpl<TbDao, TbBean> implements TbService {
        @Override
        public String save1() {
            TbBean tbBean = new TbBean();
            tbBean.setName("王五");
            tbBean.setSubject("英语");
            tbBean.setScore(113);
            this.save(tbBean);
            return "success";
        }
    }
    

此处是模拟的一个新增操作,注意类上面的@DS注解,该注解可以标注在类或方法上面;也可以标注在Mapper接口上面,但是不建议同时在Mapper和service上同时标注,可能会出现问题。该注解的value属性便是对应于在yaml中配置的数据源名称,如果没有给值,默认就是使用数据源名为master的数据源。

  • 踩坑日记:

如下代码:

@Service
@DS("master")
public class UserServiceImpl extends ServiceImpl<UserDao, UserBean> implements UserService {
 
    @Autowired
    private TbService tbService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void add() {
        UserBean userBean = new UserBean();
        userBean.setId(3);
        userBean.setLoginName("zhangsan");
        userBean.setName("张三");
        userBean.setPassword("123456");
        this.save(userBean);
		// 第二个数据源
        tbService.save1();
    }
}

意思就是我想在保存userBean时同时调用一下tbService的save1方法,注意tbService被@DS(“slave-1”)注解标注,它对应于sqlServer数据库的操作。当直接调用上面的add方法时,会报如下的错误:

反正就是死活找不到tb这张表,实际上tb这张表是确实存在于sqlServer数据库中的,之所以报错是由于加事务的原因@Transactional(rollbackFor = Exception.class),由于spring事务默认的传播级别是:

Propagation.REQUIRED

这个事务的特性就是如果上级方法调用时已经获取了事务,则该方法内调用的其它事务方法将复用同一个事务,结果就是对userBean的操作是对应于mysql的,由于加了事务,所以tbService.save1()方法还是在该事务内,造成的结果就是会在mysql数据库中找tb这张表,肯定找不到,结果就报错了,解决方式如下:

@Service
@DS("slave-1")
public class TbServiceImpl extends ServiceImpl<TbDao, TbBean> implements TbService {
    @Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    public String save1() {
        TbBean tbBean = new TbBean();
        tbBean.setName("王五");
        tbBean.setSubject("英语");
        tbBean.setScore(113);
        this.save(tbBean);
        return "success";
    }
}

给save1()方法加上  @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) , 使其在每次获取事务时都是重新产生一个,不再复用上级方法的事务。

druid + mybatis 所数据源配置

  • pom

            <!-- Druid 数据连接池依赖 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.9</version>
            </dependency>
           <!--MyBatis整合SpringBoot框架的起步依赖-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.4</version>
            </dependency>
            <!-- jdbc -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
                <version>2.7.8</version>
            </dependency>
            <!-- Mysql驱动包 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.27</version>
            </dependency>
    
  • yml

    
    # druid 多数据源配置
    master:
      datasource:
        url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    slave:
      datasource:
        url: jdbc:mysql://43.143.217.124:3306/hongbei?characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    
  • 数据源一 配置

    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.annotation.Value;
    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 javax.sql.DataSource;
    
    
    
    /**
     * @Classname DruidConfig
     * @Description DruidConfig
     * @Date 2023-02-27 10:45
     * @Created by lihw
     */
    @Configuration
    @MapperScan(basePackages = {DruidConfig.PACKAGE},
            sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class DruidConfig {
    
        // 精确到 master 目录,以便跟其他数据源隔离
        static final String PACKAGE = "com.example.demo.mapper.master";
        static final String MAPPER_LOCATION = "classpath:abc/**/*.xml";
    
        @Value("${master.datasource.url}")
        private String url;
    
        @Value("${master.datasource.username}")
        private String user;
    
        @Value("${master.datasource.password}")
        private String password;
    
        @Value("${master.datasource.driver-class-name}")
        private String driverClass;
    
        @Bean("masterDataSource")
        @Primary
        public DataSource masterDataSource(){
            DruidDataSource druidDataSource = new DruidDataSource();
            druidDataSource.setDriverClassName(driverClass);
            druidDataSource.setUrl(url);
            druidDataSource.setUsername(user);
            druidDataSource.setPassword(password);
            return druidDataSource;
        }
    
        @Bean("masterTransactionManager")
        @Primary
        public DataSourceTransactionManager masterTransactionManager(){
            return new DataSourceTransactionManager(masterDataSource());
        }
    
        @Bean("masterSqlSessionFactory")
        @Primary
        public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
            final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource);
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources(MAPPER_LOCATION));
            // mybatis 配置
            org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
            // 驼峰下划线
            configuration.setMapUnderscoreToCamelCase(true);
            sqlSessionFactoryBean.setConfiguration(configuration);
    
            return sqlSessionFactoryBean.getObject();
        }
    
    }
    
    
  • 数据源二 配置

    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.annotation.Value;
    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 javax.sql.DataSource;
    
    
    /**
     * @Classname DruidConfig
     * @Description DruidConfig
     * @Date 2023-02-27 10:45
     * @Created by lihw
     */
    @Configuration
    @MapperScan(basePackages = {DruidConfig2.PACKAGE},
            sqlSessionFactoryRef = "slaveSqlSessionFactory")
    public class DruidConfig2 {
    
        // 精确到 master 目录,以便跟其他数据源隔离
        static final String PACKAGE = "com.example.demo.mapper.slave";
        static final String MAPPER_LOCATION = "classpath:slave/**/*.xml";
    
        @Value("${slave.datasource.url}")
        private String url;
    
        @Value("${slave.datasource.username}")
        private String user;
    
        @Value("${slave.datasource.password}")
        private String password;
    
        @Value("${slave.datasource.driver-class-name}")
        private String driverClass;
    
        @Bean("slaveDataSource")
        @Primary
        public DataSource slaveDataSource(){
            DruidDataSource druidDataSource = new DruidDataSource();
            druidDataSource.setDriverClassName(driverClass);
            druidDataSource.setUrl(url);
            druidDataSource.setUsername(user);
            druidDataSource.setPassword(password);
            return druidDataSource;
        }
    
        @Bean("slaveTransactionManager")
        @Primary
        public DataSourceTransactionManager slaveTransactionManager(){
            return new DataSourceTransactionManager(slaveDataSource());
        }
    
        @Bean("slaveSqlSessionFactory")
        @Primary
        public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
            final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource);
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources(MAPPER_LOCATION));
            // mybatis 配置
            org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
            // 驼峰下划线
            configuration.setMapUnderscoreToCamelCase(true);
            sqlSessionFactoryBean.setConfiguration(configuration);
    
            return sqlSessionFactoryBean.getObject();
        }
    
    }
    
    
  • 测试代码

    @RestController
    @RequestMapping("/test")
    public class TestController {
    
        @Autowired
        StudentMapper studentMapper;
    
        @Autowired
        SysUserMapper sysUserMapper;
    
        @GetMapping("list")
        public List<Student> getUserList(){
    
            List<Student> userList = studentMapper.getUserList();
            System.out.println(userList);
    
            return userList;
        }
    
        @GetMapping("msg2")
        public String getmsg2(){
    
            List<SysUser> user = sysUserMapper.getUserList();
            System.out.println(user);
    
            return "msg22";
        }
    
    }
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnOmBExy-1677467535745)(https://note.youdao.com/yws/res/4051/WEBRESOURCE1a8c5b356140fb73fc973a659243a302)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01、SVN 概述

SVN 概述1 概述2 功能3 工作原理4 基本操作1 概述 Apache下的一个开源的项目Subversion&#xff0c;通常缩写为 SVN&#xff0c;是一个版本控制系统版本控制系统是一个软件&#xff0c;它可以伴随我们软件开发人员一起工作&#xff0c;让编写代码的完整的历史保存下来目前它的…

数仓基础与hive入门

目录1、数仓数据仓库主流开发语言--SQL2、Apache Hive入门2.1 hive定义2.2 为什么使用Hive2.3 Hive和Hadoop关系2.4 场景设计&#xff1a;如何模拟实现Hive功能2.5 Apache Hive架构、组件3、Apache Hive安装部署3.1 metastore配置方式4、Hive SQL语言&#xff1a;DDL建库、建表…

内存保护_2:RTA-OS内存保护逻辑及配置说明

上一篇 | 返回主目录 | 下一篇 内存保护_2&#xff1a;RTA-OS内存保护逻辑及配置说明3 OS配置说明3.1 OS一些基本概念及相互关系3.1.1 基本概念3.1.2 相互关系3.2 内存保护基本逻辑&#xff08;RTA-OS&#xff09;3.2.1 应用集的基本分类3.2.2 内存保护与应用集的关系3.3 OS等级…

七大排序(Java)

目录 一、插入排序 1. 直接插入排序 2. 希尔排序 二、选择排序 1. 直接选择排序 2. 堆排序 三、交换排序 1. 冒泡排序 2. 快速排序 四、归并排序 五、总结 一、插入排序 1. 直接插入排序 抓一张牌&#xff0c;在有序的牌中&#xff0c;找到合适的位置并且插入。 时间…

三战阿里测试岗,成功上岸,面试才是测试员涨薪真正的拦路虎...

第一次面试阿里记得是挂在技术面上&#xff0c;当时也是技术不扎实&#xff0c;准备的不充分&#xff0c;面试官出的面试题确实把我问的一头雾水&#xff0c;还没结束我就已经知道我挂了这次面试。 第二次面试&#xff0c;我准备的特别充分&#xff0c;提前刷了半个月的面试题…

防止jar被反编译 不安装jdk运行jar

防止jar被反编译1.pom.xml<repositories><repository><id>jitpack</id><url>https://jitpack.io</url></repository> </repositories><dependencies><dependency><groupId>org.openjfx</groupId><…

RabbitMQ死信队列

目录 一、概念 二、出现死信的原因 三、实战 &#xff08;一&#xff09;代码架构图 &#xff08;二&#xff09;消息被拒 &#xff08;三&#xff09;消息TTL过期 &#xff08;四&#xff09;队列达到最大长度 一、概念 先从概念解释上搞清楚这个定义&#xff0c;死信&…

Spark 3.3.x 读取 HBase 2.x 异常(无法正常连接或读取数据)

无法连接 1. 先检查集群中的 HBase 服务、ZooKeeper 服务是否正常启动&#xff0c;有没有挂掉。 2. Spark 中的 HBase 版本是否与集群一致&#xff0c;代码中的相关包是否导入正确。 3. 连接参数&#xff08;地址、端口&#xff09;是否设置正确&#xff0c;如下所示&#x…

pyqt 制作exe步骤

之前的博客记录 使用pycharmpyqt 编写一个桌面端&#xff08;mac&#xff09;_python开发桌面工具mac_Y_Hungry的博客-CSDN博客 python开发exe程序界面及打包环境配置_Y_Hungry的博客-CSDN博客 1.编写代码 2.打包 pyinstaller -w --add-data "logo.ico;." --add…

Redis常见的数据类型命令

文章目录Redis 常见的数据类型及命令一、常见的NoSQL二、Redis 简介三、key 键的一些操作命令四、Redis的五种基本数据结构1、String&#xff08;字符串&#xff09;介绍常用命令1.1 set/get1.2 append1.3 strlen1.4 setex1.5 mset/mget1.6 setrange/getrange1.7 setnx1.8 incr…

数据库管理工具的使用

目录 摘要 一、Navicat是什么&#xff1f; 二、使用步骤 1.如何下载与安装 2.如何连接远程数据库 总结 摘要 本文主要介绍数据库管理工具的使用 一、Navicat是什么&#xff1f; 它是一款数据库管理工具&#xff0c;将此工具连接数据库,你可以从中看到各种数据库的详细…

JavaScript 面向对象【快速掌握知识点】

目录 类和对象 属性和方法 继承 多态 封装 类和对象 类是用于定义对象的模板或蓝图&#xff1b;它包含对象的属性和方法&#xff0c;我们可以使用class关键字来定义类。 class Person {constructor(name, age) {this.name name;this.age age;}sayHello() {console.log(H…

JSP+SQL电量监视系统设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;电脑界常有一股又一股的风潮&#xff0c;在这风潮中&#xff0c;JBuilder 是使用最广泛的工具之一。JBuilder6 提供了可视化集成开发工具&#xff0c;支持开发人员构建标准的爪哇应用系统。其开放的环境、基于组建的开发方式和丰富…

【软件测试面试题】2023年测试人面试专属,最全接口测试面试题大全(附回答)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 1、HTTP和HTTPS协议…

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A(9)

目录 竞赛内容 模块A 基础设施设置与安全加固 一、项目和任务描述&#xff1a; 二、服务器环境说明 三、具体任务&#xff08;每个任务得分以电子答题卡为准&#xff09; A-1任务一 登录安全加固&#xff08;Windows&#xff09; 1.密码策略 a.更改或创建密码时执行复杂…

17- TensorFlow实现手写数字识别 (tensorflow系列) (项目十七)

项目要点 模型创建: model Sequential()添加卷积层: model.add(Dense(32, activationrelu, input_dim100)) # 第一层需要 input_dim添加dropout: model.add(Dropout(0.2))添加第二次网络: model.add(Dense(512, activationrelu)) # 除了first, 其他层不要输入shape添加输出…

这是一款值得开发人员认真研究的软件,数据库优化,应用服务器安全优化...

1.查询数据库死锁相关信息2.查看数据库的链接情况3.当前实例上的所有用户4.创建数据库独立密码5.查看数据库使用的端口号6.当前数据库设置的最大连接数7.当前数据库最大的理论可连接数8.当前数据库实例的连接数9.当前数据库连接数10.当前数据库连接超时设置11.当前sqlserver 超…

SMART系统—考试监控及阅卷模块的设计与开发

技术&#xff1a;Java、JSP等摘要&#xff1a;Smart在线考试评估系统(简称“SMART系统”)&#xff0c;是基于Browser/Server&#xff08;简称B/S&#xff09;结构的数据库访问模式&#xff0c;采用Struts Spring Hibernate作为平台搭建的框架开发的一套新型智能的远程教育软件…

伺服三环控制深层原理解析

我们平时使用的工业伺服,通常是成套伺服,即驱动器和电机型号存在配对关系。 但有些时候,我们要用电机定转子和编码器制作非成套电机,这种时候,我们需要对驱动器进行各种设置才能驱动电机。 此篇文章将通过介绍伺服控制的三环控制原理入手来说明我们调试非成套伺服时需要…

2023年微信小程序获取手机号授权登录注册详细教程,包含服务端教程

前言 小程序中有很多地方都会用到用户的手机号&#xff0c;比如登陆注册&#xff0c;填写收货地址等等。有了这个组件可以快速获取微信绑定手机号码&#xff0c;无须用户填写。网上大多数教程还是往年的&#xff0c;而微信官方的api已做了修改。本篇文章将使用最新的方法获取手…