Springboot 2.7.5 HikariCP 连接池多数据源配置

news2024/11/13 12:47:07

一. 引言

当前项目遇到需要连接多个数据库的场景,此时需要引入多数据源了.
还有一些诸如以下的场景:

  1. 与第三方对接时,有些合作方并不会为了你的某些需求而给你开发一个功能,他们可以提供给你一个可以访问数据源的只读账号,你需要获取什么数据由你自己进行逻辑处理,这时候就避免不了需要进行多数据源了
  2. 业务数据达到了一个量级,使用单一数据库存储达到了一个瓶颈,需要进行分库分表等操作进行数据管理,在操作数据时,不可避免的涉及到多数据源问题

网上搜索发现有不少的示例都是错误的,于是自己打算写一篇,也方便以后自己需要用到的时候拿来参考.

如果你只想要看代码请直接拉到最后看完整代码哦~
如果你用的是Mybatis-Plus请查看官方文档↓↓↓↓
MP多数据源配置

至于MyCat、Sharding-JDBC之类的中间件我们今天不谈,只分享多数据源配置方案.

二. 实践

HikariCP项目仓库

注意
Springboot 2.0开始开始默认引入了HikariCP依赖,所以我们不需要单独引入!

HikariDataSource是 HikariCP 开放给用户使用连接池的主要操作类。所以,我们创建一个 HikariCP 的连接池,其实就是构造一个HikariDataSource.

1. 首先我们来看一下正常情况下我们配置的单数据源的配置

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/db_xxx?useSSL=false&autoReconnect=true&characterEncoding=utf8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    # 指定为HikariDataSource
    type: com.zaxxer.hikari.HikariDataSource
    # hikari连接池配置
    hikari:
      #连接池名
      pool-name: HikariCP
      #最小空闲连接数
      minimum-idle: 5
      # 空闲连接存活最大时间,默认10分钟
      idle-timeout: 600000
      # 连接池最大连接数,默认是10
      maximum-pool-size: 10
      # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
      auto-commit: true
      # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
      max-lifetime: 1800000
      # 数据库连接超时时间,默认30秒
      connection-timeout: 30000
      # 连接测试query
      connection-test-query: SELECT 1

2. 看看多数据源的配置示例(下面都以这个配置为准)

spring:
  datasource:
    # 数据源-1
    primary:
      url: jdbc:mysql://127.0.0.1:3306/db_market?useSSL=false&autoReconnect=true&characterEncoding=utf8
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: root
      # 指定为HikariDataSource
      type: com.zaxxer.hikari.HikariDataSource
      # hikari连接池配置 对应 HikariConfig 配置属性类
      hikari:
        pool-name: HikariCP-Primary
        #最小空闲连接数
        minimum-idle: 5
        # 空闲连接存活最大时间,默认10分钟
        idle-timeout: 600000
        # 连接池最大连接数,默认是10
        maximum-pool-size: 10
        # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
        auto-commit: true
        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
        max-lifetime: 1800000
        # 数据库连接超时时间,默认30秒
        connection-timeout: 30000
        # 连接测试query
        connection-test-query: SELECT 1
    # 数据源-2
    secondary:
      url: jdbc:mysql://192.168.58.212:3306/db_market?useSSL=false&autoReconnect=true&characterEncoding=utf8
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 12345678
      # 指定为HikariDataSource
      type: com.zaxxer.hikari.HikariDataSource
      # hikari连接池配置
      hikari:
        pool-name: HikariCP-Secondary
        minimum-idle: 5
        idle-timeout: 600000
        maximum-pool-size: 10
        auto-commit: true
        max-lifetime: 1800000
        connection-timeout: 30000
        connection-test-query: SELECT 1

3. 接下来看看网上出现的不少这样子的例子(这里认为是错误示例)

@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
   return DataSourceBuilder.create().build();
}
 
@Bean(name = "usersDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
   return DataSourceBuilder.create().build();
}

对于多数据源的配置,这里由于 hikari 这个属性对应的值还在下一层,所以使用上面这种配置是不生效的. 因为:

  • 这里使用了Hikari,所以这里创建的DataSource这个Bean其实是HikariDataSource.
  • @ConfigurationProperties(prefix = “spring.datasource.primary”)会将primary下的属性赋值给HikariDataSource这个Bean中的对应的属性(其实就是给HikariConfig这个赋值,更具体的信息大家可以自行搜索DataSource的初始化流程. 下面源码图中可看到HikariDataSource继承了HikariConfig).
  • 但是,hikari这个属性因为是spring.datasource.primary的第二层属性,并不能正确设置进去(后面我们会验证这个问题,注意看我下图中框出来LOGGER打印那里).
    在这里插入图片描述

4. 下面是我完整的多数据源配置类(最终版本会分成两个进行配置)


import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * @ClassName: HikariDataSourceConfiguration
 * @Author: lequal
 * @Date: 2022/12/22
 * @Description: 多数据源配置
 */
@Configuration
public class HikariDataSourceConfiguration {

    @Primary
    @Bean("primaryDataSourceProperties")
    @ConfigurationProperties("spring.datasource.primary")
    public DataSourceProperties primaryDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean("primaryDataSource")
    @Qualifier(value = "primaryDataSource")
    // 留意下面这行
    @ConfigurationProperties(prefix = "spring.datasource.primary.hikari")
    public HikariDataSource primaryDataSource() {
        return primaryDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean("secondaryDataSourceProperties")
    @ConfigurationProperties("spring.datasource.secondary")
    public DataSourceProperties secondaryDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean("secondaryDataSource")
    @Qualifier(value = "secondaryDataSource")
    // 留意下面这行
    @ConfigurationProperties(prefix = "spring.datasource.secondary.hikari")
    public HikariDataSource secondaryDataSource() {
        return secondaryDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean(name = "primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

参考资料(实践证明有事找官方文档是挺标准的)↓↓↓↓↓
Spring官方文档多数据配置示例

注意上面我在两个
@ConfigurationProperties(prefix = “spring.datasource.primary.hikari”)
@ConfigurationProperties(prefix = “spring.datasource.secondary.hikari”)
第一、第二数据源配置都做了标记

验证我们上面说的配置失效的问题,步骤:
1、当我们注释掉这两行,此时的配置就相当于是上面提到的错误示例的样子了
2、多数据源配置以上面代码为准,我分别设置两个数据源的连接池名称是HikariCP-PrimaryHikariCP-Secondary,再结合最上面贴图红框中HikariDataSource构造方法知道Bean初始化时会打印数据池名称

LOGGER.info(“{} - Starting…”, configuration.getPoolName());

3、启动项目,查看控制台
在这里插入图片描述
此时,你会发现,数据源初始化出来的并不是我们需要的,这足以说明我们配置的spring.datasource.primary.hikari这一层属性没有被正确地设置到HikariConfig中(虽然能跑起来,可以正确连接到对应的数据源,但是其它的配置并未生效),而是HikariConfig在初始化时自动给每个数据源加上了名字,可以见以下源码(HikariConfig.class)
在这里插入图片描述
假如,这时候我们把
第一、第二数据源配置上面的@ConfigurationProperties(prefix = “spring.datasource.primary.hikari”)注解打开,再启动项目,则可以清晰地看到我们自己设置的属性被应用到了HikariConfig中.
在这里插入图片描述
这时候就可以正常地读入hikari连接池的配置了.

有不理解的可以自己看看DataSource的初始化流程即可.

5. 接下来我们做一下测试

import cn.hutool.json.JSONUtil;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * @ClassName: MultiDataSourceTest
 * @Author: lequal
 * @Date: 2022/12/22
 * @Description:
 */
@SpringBootTest
public class MultiDataSourceTest {

    @Resource
    private JdbcTemplate primaryJdbcTemplate;
    @Resource
    private JdbcTemplate secondaryJdbcTemplate;

    @Resource(name = "primaryDataSource")
    private DataSource primaryDataSource;

    @Resource(name = "secondaryDataSource")
    private DataSource secondaryDataSource;

    @Test
    public void testPrimaryDataSourceConnect() {
        String sql = "SELECT * FROM `apk_category`";
        List<Map<String, Object>> result = primaryJdbcTemplate.queryForList(sql);
        System.out.println("primary data source :\t"+ JSONUtil.toJsonStr(result));
    }

    @Test
    public void testSecondaryDataSourceConnect() {
        String sql = "SELECT * FROM `apk_category`";
        List<Map<String, Object>> result = secondaryJdbcTemplate.queryForList(sql);
        System.out.println("secondary data source :\t"+ JSONUtil.toJsonStr(result));
    }

    @Test
    void testGetConnection() {
        try (Connection connection = primaryDataSource.getConnection()) {
            System.out.println("获取到的primaryDataSource连接对象" + connection);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try (Connection connection = secondaryDataSource.getConnection()) {
            System.out.println("获取到的secondaryDataSource连接对象" + connection);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

三.完整代码

  1. PrimaryDataSourceConfiguration.class
import com.zaxxer.hikari.HikariDataSource;
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.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * @ClassName: PrimaryDataSourceConfiguration
 * @Author: lequal
 * @Date: 2022/12/22
 * @Description: 主要数据源配置
 */
@Configuration
@MapperScan(basePackages = "com.market.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfiguration {

    /**
     * 指定mapper xml文件路径
     */
    public static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    /**
     * @Author: lequal
     * @Description 获取一级的属性
     * @Date 2022/12/22 16:48
     * @return org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
     */
    @Primary
    @Bean("primaryDataSourceProperties")
    @ConfigurationProperties("spring.datasource.primary")
    public DataSourceProperties primaryDataSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * @Author: lequal
     * @Description 获取下一级的属性(hikari)并创建数据源
     * @Date 2022/12/22 16:48
     * @return com.zaxxer.hikari.HikariDataSource
     */
    @Primary
    @Bean("primaryDataSource")
    @Qualifier(value = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary.hikari")
    public HikariDataSource primaryDataSource() {
        return primaryDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    /**
     * @Author: lequal
     * @Description 自定义SQLSession工厂
     * @Date 2022/12/22 16:50
     * @param dataSource
     * @return org.apache.ibatis.session.SqlSessionFactory
     */
    @Primary
    @Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(PrimaryDataSourceConfiguration.MAPPER_LOCATION));
        return sessionFactoryBean.getObject();
    }

    /**
     * @Author: lequal
     * @Description 创建JDBC模板
     * @Date 2022/12/22 16:48
     * @param dataSource
     * @return org.springframework.jdbc.core.JdbcTemplate
     */
    @Bean(name = "primaryJdbcTemplate")
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}
  1. SecondaryDataSourceConfiguration.class
import com.zaxxer.hikari.HikariDataSource;
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.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * @ClassName: HikariDataSourceConfiguration
 * @Author: lequal
 * @Date: 2022/12/22
 * @Description: 副数据源配置
 */
@Configuration
@MapperScan(basePackages = "com.market.mapper2", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfiguration {

    /**
     * 指定mapper xml文件路径
     */
    public static final String MAPPER_LOCATION = "classpath:mapper2/*.xml";

    /**
     * @Author: lequal
     * @Description 获取一级的属性
     * @Date 2022/12/22 16:48
     * @return org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
     */
    @Bean("secondaryDataSourceProperties")
    @ConfigurationProperties("spring.datasource.secondary")
    public DataSourceProperties secondaryDataSourceProperties() {
        return new DataSourceProperties();
    }

    /**
     * @Author: lequal
     * @Description 获取下一级的属性(hikari)并创建数据源
     * @Date 2022/12/22 16:48
     * @return com.zaxxer.hikari.HikariDataSource
     */
    @Bean("secondaryDataSource")
    @Qualifier(value = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary.hikari")
    public HikariDataSource secondaryDataSource() {
        return secondaryDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }


    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(SecondaryDataSourceConfiguration.MAPPER_LOCATION));
        return sessionFactoryBean.getObject();
    }

    /**
     * @Author: lequal
     * @Description 创建JDBC模板
     * @Date 2022/12/22 16:48
     * @param dataSource
     * @return org.springframework.jdbc.core.JdbcTemplate
     */
    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

至于你后面获取到不同的数据源如何操作取决于你自己了.

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

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

相关文章

Web漏洞扫描篇-Nessus使用

软件介绍 Nessus是一种漏洞扫描器&#xff0c;个人和组织广泛使用它来识别和修复计算机系统中的漏洞。Nessus可以扫描广泛的漏洞&#xff0c;包括缺少补丁、弱密码和配置错误的系统&#xff0c;它可以扫描单个系统或整个网络上的漏洞。Nessus可以在各种平台上运行&#xff0c;…

【云原生进阶之容器】第一章Docker核心技术1.10节——Docker网络模型设计

1 容器网络背景概述 1.1 Linux的namespace+cgroup 先来简要回顾一下前面的内容,namespace和cgroup是Linux 内核的两大特性,namespace的诞生据说就是为了支持容器技术,那么这俩特性到底干了啥呢? - namespace:linux支持多种类型的namespace,包括Network,IPC,PID, Mount…

基于HOG、LBP完成特征工程,基于SVM/RF/XGBOOST/GBDT/CNN/DNN完成人脸识别+表情识别

在我之前的文章中写过很多关于人脸识别和表情识别的文章&#xff0c;今天有一个项目的需求就是需要做两种或者是多种任务&#xff0c;我在开发完对应的模型之后就突然想到了之前做过的人脸识别和表情识别的项目&#xff0c;就想着是否可以基于机器学习/深度学习等方式来同时实现…

算法训练第五十七天 | LeetCode 647、516动态规划结尾

LeetCode 647回文子串 题目简析&#xff1a; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 思路分析&#xff1a; 本题的难点 主要…

【Aptos与Sui智能合约】(Move长话短说) #03 - 智能合约编写与发布

前言:本篇学习如何在Aptos上发布两个自定义的智能合约 0x1 前置条件 安装好Aptos工具,MacOS、Ubuntu、Windows系统的预编译的安装包下载地址 https://github.com/aptos-labs/aptos-core/releases?q=cli&expanded=true 想自己从源码开始编译,你就下载Source Code 安装…

千万不要把Request传递到异步线程里面,有坑

前几天在网上冲浪的时候看到一篇技术文章&#xff0c;讲的是他把一个 request 请求传递到了线程池里面&#xff0c;然后遇到了一个匪夷所思的情况。 他写了这篇文章&#xff0c;把自己针对这个问题的探索过程分享了出来&#xff1a; 《springboot 中如何正确的在异步线程中使用…

艾美捷脂质过氧化检测试剂盒参数说明和文献参考

脂质过氧化的定量对于评估氧化损伤在病理生理学疾病中的作用至关重要。脂质过氧化导致饱和和不饱和脂质的高反应性和不稳定的氢过氧化物的形成。 艾美捷脂质过氧化检测试剂盒直接利用与亚铁离子的氧化还原反应测量过氧化氢&#xff0c;将脂质过氧化氢提取到氯仿中&#xff0c;提…

【python绘制地图——folium的方法和类的介绍(思维导图)】

Python使用folium制作地图并生成png图片 第一章 folium的方法和类的介绍&#xff08;思维导图&#xff09; 第二章 使用folium制作地图 第三章 folium实用功能进阶 第三章 使用Html2Image生成png图片 第四章 使用reportlab制作pdf报告 文章目录Python使用folium制作地图并生成…

轮廓图编程-自定义QChartView

目录 一、功能需求 二、实现效果 三、实现方法 一、功能需求 3D测量软件中&#xff0c;需要在轮廓上进行二次编程&#xff0c;需要显示轮廓线&#xff0c;然后可以调节矩形框的范围的获取参数&#xff0c;如华汉的HyperShape3D软件&#xff0c;对轮廓的编程界面如下。 二、实…

【Java基础知识复盘】String、StringBuffer、StringBuilder篇——持续更新中

本人知识复盘系列的博客并非全部原创&#xff0c;大部分摘自网络&#xff0c;只是为了记录在自己的博客方便查阅&#xff0c;往后也会陆续在本篇博客更新本人查阅到的新的知识点&#xff0c;望悉知&#xff01; String类 在 Java 中字符串属于对象&#xff0c;Java 提供了 Str…

《融合视觉显著性和局部熵的红外弱小目标检测》论文复现

1.复现论文概要 复现的论文为《融合视觉显著性和局部熵的红外弱小目标检测》&#xff08;赵鹏鹏&#xff0c;李庶中等&#xff0c;中国光学2022&#xff0c;http://www.chineseoptics.net.cn/cn/article/doi/10.37188/CO.2021-0170&#xff0c;以下简称论文&#xff09;。论文…

【库存控制】基于象鼻虫损害优化算法求解库存控制问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

交换机的结构特点及主要功能

什么是交换机&#xff1f; Switch 意为“交换机”&#xff0c;是一种用于转发电 ( 光 ) 信号的网络设备。它可以为访问交换机的任意两个网络节点提供专用的电信号路径。非常常见的 是以太网交换机。其他常见的有电话语音交换机、光纤交换机等。 它的工作原理是什么&#xff1f…

美国藤校Top30大学对IB成绩的要求

众所周知&#xff0c;IB体系是目前全球认可度比较高的国际课程。那么&#xff0c;用IBDP成绩申请美国TOP30大学需要什么样的成绩&#xff1f; 小智今天来带大家好好研究下美国TOP30大学对IB成绩的要求。普林斯顿大学 Princeton University 普林斯顿大学对于IB成绩没有具体要求&…

nginx架构解析:朴实中见真知

目录前言为什么高并发很重要Apache可以做到吗使用nginx会更有优势吗&#xff1f;nginx架构概览代码结构Workers模型nginx进程规则nginx缓存概览nginx配置nginx内部典型的HTTP请求处理循环课程总结前言 nginx&#xff08;发音“engine x”&#xff09;是俄国的软件工程师Igor S…

Godzilla(哥斯拉)安装与使用

Godzilla安装与使用1.Godzilla介绍2.Godzliia下载与安装2.1.Godzilla下载2.2.运行环境2.3.Godzilla安装2.3.1.执行文件2.3.2.安装完成3.Godzliia3.1.Godzliia使用3.1.1.生成木马3.1.2.存储木马3.1.3.放入木马3.1.4.访问木马3.1.5.连接木马3.1.6.测试连接3.1.7.连接进入3.2.Godz…

麒麟水乡,IU酒店进驻云南旅游咽喉之地曲靖

曲靖位于云南省东北部&#xff0c;是云南连接内地的重要陆路通道&#xff0c;素有“滇黔锁钥”、“入滇门户”、“云南咽喉”之称&#xff0c;是仅次于昆明的云南第二大城市。曾入选“中国十佳宜居城市”榜单10次的城市&#xff0c;拥有3000多年的文明史&#xff0c;早在三国魏…

Python解题 - CSDN周赛第17期 - 拯救公主

本期又出现了题目测试数据的问题&#xff0c;而且题目和算法关系也不太大&#xff0c;基本就属于用代码代替手工解答算术题的感觉。不禁让人怀疑官方题库是否已经没有高质量的题了&#xff0c;同时也怀疑长期满分却又不更新博客拿奖品的某位选手是不是托。。。 第一题&#xff…

VS系列多通道振弦传感器无线采发仪与参数配置工具连接

VS101~VS432 设备配备了专门的参数配置工具 SETP 来完成设备工作参数的查看和修改工作。 连接前的准备工作 &#xff08;1&#xff09;数据接口与计算机连接 使用标配的通讯线与计算机 RS232 接口连接。若需基于手机网络发送数据&#xff0c;请在开机前安装 SIM 卡。 若…

D. Lucky Chains(GCD+素数筛)

input: 4 5 15 13 37 8 9 10009 20000output: 0 1 -1 79题目大意&#xff1a; 如果一个数对(x,y)是幸运的&#xff0c;当且仅当gcd(x,y)1,一条链可以由以下规律的数对组成&#xff0c;(x,y),(x1,y1),(x2,y2)……(xk,yk)&#xff0c;如果说一条链是幸运的&#xff0c;当且仅当…