【五一创作】Springboot+多环境+多数据源(MySQL+Phoenix)配置及查询(多知识点)

news2024/11/24 19:42:22

文章目录

  • 1. 背景
  • 2. 技术点
  • 3 子模块依赖SpringBoot设置
  • 4. 多环境配置
    • 4.1 application.yml
    • 4.2 application-pro.yml
  • 5. 多数据源配置
    • 5.1 yml配置
    • 5.2 自定义数据源在Java中配置
      • 5.2.1 PhoenixDataSourceConfig
      • 5.2.2 MysqlDataSourceConfig
  • 6. 完整的Pom
  • 6. 测试
    • 6.1 Mapper配置
    • 6.2 方法调用
    • 6.3 查询

1. 背景

实时数据展示,通常分两部分,
一部分是离线数据计算,这部分通过大数据程序计算好后,同步到MySQL中。
一部分是实时程序,这部分是Flink实时写入Phoenix表中。
这样两部分拼接好后,就是完整的实时数据部分,所以现在一个接口查询需要将MySQL和Phoenix中的表查询并合并在一起。

2. 技术点

通过本篇博客,将可以学习到Spring多环境配置、多数据源配置、数据库自定义连接池设置、子模块搭建SpringBoot程序等内容。

  • 多数据源配置
  • springboot多环境设置
  • 数据库连接池Druid配置

3 子模块依赖SpringBoot设置

由于我的项目是一个子模块,已经存在父模块,无法再添加Parent模块引入Springboot,所以需要通过依赖方式引入Springboot包。
Pom中依赖设置如下:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.14</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

4. 多环境配置

通常开发环境分为dev、test、pro三个环境,所以在Springboot中需要根据不同的环境使用不同的配置文件,在resources中建立以下四个文件。
application.yml
application-dev.yml
application-pro.yml
application-test.yml
在这里插入图片描述

4.1 application.yml

其中,application.yml配置如下:

spring:
  profiles:
    active: "@profileActive@"
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

mybatis-plus是作为公共的配置部分放到这里的。
spring.profiles.active是读取动态配置的,这里的@profileActive@需要和Pom文件联动设置。
Pom文件中设置如下:

<!--多环境配置优先级,默认配置dev -->
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <profileActive>dev</profileActive>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profileActive>test</profileActive>
            </properties>
        </profile>
        <profile>
            <id>pro</id>
            <properties>
                <profileActive>pro</profileActive>
            </properties>
        </profile>
    </profiles>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

通过以上的设置以后,就可以在 idea的maven中看到如下的配置。
在这里插入图片描述

4.2 application-pro.yml

这里可以根据具体的环境,进行不一样的配置

spring:
  config:
    activate:
      on-profile: pro
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://IP:3306/WEB_SERVER?characterEncoding=utf-8&useSSL=false
    username: test
    password: test
server:
  port: 8802

spring.config.active.on-profile 注意这个是springboot 2.4版本以后更改的。
之前的版本使用的是spring.profiles,但是不推荐使用了。

application-dev.yml在下面重点说明。

5. 多数据源配置

一个服务引入多个数据源时,需要分别定义每个数据源的配置。所以这里我们以在application-dev.yml配置为例子。

5.1 yml配置

通常以下面方式在yml中定义数据源。

spring:
  datasource:
    db1:
      xxx
      xxx
    db2:
      yyy
      yyy  

我们这里的需求是mysql和phoenix两个数据源如下,并且修改了连接池为Druid:
在这里插入图片描述

完整内容如下:

spring:
  config:
    activate:
      on-profile: dev
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5                                       # 初始化大小
      min-idle: 10                                          # 最小连接数
      max-active: 20                                        # 最大连接数
      max-wait: 60000                                       # 获取连接时的最大等待时间
      min-evictable-idle-time-millis: 300000                # 一个连接在池中最小生存的时间,单位是毫秒
      time-between-eviction-runs-millis: 60000              # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
      filters: stat,wall                                    # 配置扩展插件:stat-监控统计,log4j-日志,wall-防火墙(防止SQL注入),去掉后,监控界面的sql无法统计
      test-on-borrow: true                                  # 申请连接时执行validationQuery检测连接是否有效,默认true,开启后会降低性能
      test-on-return: true                                  # 归还连接时执行validationQuery检测连接是否有效,默认false,开启后会降低性能
      test-while-idle: true                                 # 申请连接时如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,默认false,建议开启,不影响性能
      validation-query: SELECT 1                            # 检测连接是否有效的 SQL语句,为空时以下三个配置均无效
      connectionTestQuery: SELECT 1
      stat-view-servlet:
        enabled: true                                       # 是否开启 StatViewServlet
        allow: 127.0.0.1                                    # 访问监控页面 白名单,默认127.0.0.1
        deny: ip                                            # 访问监控页面 黑名单
        login-username: admin                               # 访问监控页面 登陆账号
        login-password: admin                               # 访问监控页面 登陆密码
      filter:
        stat:
          enabled: true                                     # 是否开启 FilterStat,默认true
          log-slow-sql: true                                # 是否开启 慢SQL 记录,默认false
          slow-sql-millis: 5000                             # 慢 SQL 的标准,默认 3000,单位:毫秒
          merge-sql: false                                  # 合并多个连接池的监控数据,默认false
        wall:
          config:
            multi-statement-allow: true
      web-stat-filter:
        enabled: true
        exclusions:
          - "*.js"
          - "*.gif"
          - "*.jpg"
          - "*.png"
          - "*.css"
          - "*.ico"
          - "/monitor/druid/*"

    mysql: # 数据源1
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://XXXXipXXXXX:3306/TEST_SERVER?characterEncoding=utf-8&useSSL=false
      username: test
      password: test
      mapper-locations: classpath*:mapper/mysql/*.xml
      filters: stat,wall
      test-on-borrow: true
      test-while-idle: true
      validation-query: SELECT 1

    phoenix: # 数据源2
      driver-class-name: org.apache.phoenix.jdbc.PhoenixDriver
      jdbc-url: jdbc:phoenix:IP地址:2181:/hbase
      username: phoenix
      password: ""
      mapper-locations: classpath*:mapper/phoenix/*.xml
      filters: stat
      test-on-borrow: true
      test-while-idle: true
      validation-query: SELECT 1
server:
  port: 8801

需要说明的是,在spring.datasource.druid下面的配置,针对phoenix数据源,只是部分生效。
例如filters: stat,wall 如果配置在spring.datasource.druid下面,针对phoenix的数据源其实并没有生效。
我们在druid的监控页面中会发现filter类名为空。
在这里插入图片描述
所以在spring.datasource.phoenix下面又加了filters: stat之后才生效的。如下:
在这里插入图片描述

如果在Druid中的数据源只是显示(*) property for user to setup,是因为还有接口查询,并不是什么配置有问题,接口查询一次就会显示有记录了。
在这里插入图片描述

注意点:

这里配置了自定义的数据连接池是阿里的Druid,默认的是Hikari。
关于Druid和Hikari的比较,可以大概参考下图,网上找的。
在这里插入图片描述

5.2 自定义数据源在Java中配置

除了在yml中配置spring.datasource.mysql或者spring.datasource.phoenix自定义数据源以外,还需要再java中单独配置数据源。
在这里插入图片描述
新建config文件夹,针对不同的数据源进行单独的配置。

5.2.1 PhoenixDataSourceConfig

注意:自定义数据源中,虽然我们设置了@ConfigurationProperties(prefix = "spring.datasource.phoenix"),但是如果直接使用DataSourceBuilder.create().build();创建datasource,
并不会生效,可能是多数据源配置的原因,必须手工来创建,如下:

@Slf4j
@Configuration
@MapperScan(basePackages = "com.king.mapper.phoenix",sqlSessionTemplateRef = "phoenixSqlSessionTemplate")
public class PhoenixDataSourceConfig {

    @Value("${spring.datasource.phoenix.mapper-locations}")
    private String mapperLocation;
    @Value("${spring.datasource.phoenix.jdbc-url}")
    private String jdbcUrl;
    @Value("${spring.datasource.phoenix.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.phoenix.username}")
    private String username;
    @Value("${spring.datasource.phoenix.password}")
    private String password;


    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.phoenix")
    public DataSource phoenixDataSource() throws SQLException {
        log.info("init phoenix data source");
//        DataSource ds = DataSourceBuilder.create().build();
        DruidDataSource ds = new DruidDataSource();
        ds.setUrl(jdbcUrl);
        ds.setDriverClassName(driverClassName);
        ds.setUsername(username);
        ds.setPassword(password);
        Properties prop = new Properties();
        prop.setProperty("phoenix.schema.isNamespaceMappingEnabled","true");
        prop.setProperty("phoenix.schema.mapSystemTablesToNamespace","true");
        ds.setConnectProperties(prop);
        return ds;
    }

    @Bean
    public SqlSessionFactory phoenixSqlSessionFactory(@Qualifier("phoenixDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocation));
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean
    public DataSourceTransactionManager phoenixTransactionManager(@Qualifier("phoenixDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("phoenixSqlSessionTemplate")
    public SqlSessionTemplate phoenixSqlSessionTemplate(@Qualifier("phoenixSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

关于phoenix的一些特殊连接设置可以通过ds.setConnectProperties(prop)来进行特殊的配置。
@Value是读取的yml中设置的一些属性。

5.2.2 MysqlDataSourceConfig

MySql数据源的设置如下:

@Slf4j
@Configuration
@MapperScan(basePackages = "com.king.mapper.mysql", sqlSessionTemplateRef = "mysqlSqlSessionTemplate")
public class MysqlDataSourceConfig {
//    public static String MYSQL_LOCATION_PATTERN ="classpath*:mapper/mysql/*.xml";

    @Value("${spring.datasource.mysql.mapper-locations}")
    private String mapperLocation;
    @Value("${spring.datasource.mysql.jdbc-url}")
    private String jdbcUrl;
    @Value("${spring.datasource.mysql.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.mysql.username}")
    private String username;
    @Value("${spring.datasource.mysql.password}")
    private String password;
//    @Value("${spring.datasource.ds1.initialSize}")
//    private int initialSize;
//    @Value("${spring.datasource.ds1.minIdle}")
//    private int minIdle;
//    @Value("${spring.datasource.ds1.maxActive}")
//    private int maxActive;


    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource mysqlDataSource() {
//        DataSource ds = DataSourceBuilder.create().build();
        log.info("init mysql data source");
        DruidDataSource ds = new DruidDataSource();
        ds.setUrl(jdbcUrl);
        ds.setDriverClassName(driverClassName);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }

    @Bean
    @Primary
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //开启驼峰
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);
        bean.setConfiguration(configuration);
        //指定当前数据源的mybatis的Xml文件的路径"
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocation));
        return bean.getObject();
    }

    @Bean
    @Primary
    public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    @Primary
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

关于springboot默认的数据源自动配置选项,经过测试可以不用手工关闭的。

//@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@SpringBootApplication
public class PhoenixApplication {

    public static void main(String[] args) {
        SpringApplication.run(PhoenixApplication.class, args);
    }
}

6. 完整的Pom

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>bigdata_study</artifactId>
        <groupId>com.king</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>phoenix_client</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.phoenix</groupId>
            <artifactId>phoenix-client-hbase</artifactId>
            <version>2.4.0-5.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.0-jre</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.14</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--多环境配置优先级,默认配置dev -->
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <profileActive>dev</profileActive>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profileActive>test</profileActive>
            </properties>
        </profile>
        <profile>
            <id>pro</id>
            <properties>
                <profileActive>pro</profileActive>
            </properties>
        </profile>
    </profiles>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

6. 测试

6.1 Mapper配置

根据不同的数据源,创建不同的目录,以及各自的查询方法。
在这里插入图片描述

6.2 方法调用

在Service中调用2个数据源查询,并将结果集合并一起。

@Service
public class GmxHotTradeServiceImpl extends ServiceImpl<GmxHotTradePhoenixMapper, GmxHotTradeDTO> implements GmxHotTradeService {

    @Autowired
    private GmxHotTradePhoenixMapper gmxHotTradePhoenixMapper;
    @Autowired
    private GmxHotTradeMysqlMapper gmxHotTradeMysqlMapper;

    @Override
    public List<GmxHotTradeDTO> queryList(String action,Integer time) {
        List<GmxHotTradeDTO> hotTradeList1 = gmxHotTradePhoenixMapper.queryHotTrade(action, time);
        List<GmxHotTradeDTO> hotTradeList2 = gmxHotTradeMysqlMapper.queryHotTrade(action, time);
        hotTradeList1.addAll(hotTradeList2);
        return hotTradeList1;
    }
}

6.3 查询

通过在前端查询Controller中的接口,可以在Druid的监控页面查询到请求的信息:
http://localhost:8801/druid/index.html

在这里插入图片描述
SQL监控:
在这里插入图片描述
URL请求:
在这里插入图片描述

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

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

相关文章

字符、块、网络设备

设备模型&#xff08;的意义&#xff09; 降低设备多样性带来的Linux驱动开发的复杂度&#xff0c;以及设备热拔插处理、电源管理等&#xff0c;Linux内核提出了设备模型概念。设备模型将硬件设备归纳、分类&#xff0c;然后抽象出一套标准的数据结构和接口。驱动的开发&#…

Java项目上线之云服务器环境篇(四)——Redis的安装与配置

Java项目上线之云服务器环境篇&#xff08;四&#xff09;——Redis的安装与配置 在我们的项目里可能会用到Redis缓存&#xff0c;需要对Redis进行简单的配置。 1、我们的redis最好放在一个事先安装好的文件夹里&#xff0c;这样更方便于管理。 例如&#xff1a; redis我是放在…

前端开发:JS的事件循环执行机制详解

前言 在前端开发中&#xff0c;涉及到JS原生的使用原理是非常重要的知识点&#xff0c;尤其是在实际工作过程中会遇到各种复杂的业务需求场景&#xff0c;以及具体开发中可能会遇到一些涉及基于JS原理的使用&#xff0c;这都要求开发者能够很好的了解和掌握JS原生的常用原理。J…

jvm之类加载器

写在前面 当我们通过javac命令将java源代码编译为Java字节码后&#xff0c;必须通过类加载器将其加载到jvm中才能运行&#xff0c;所以类加载器是jvm中非常重要的一个组成部分&#xff0c;本文我们就一起来看下吧&#xff01; 1&#xff1a;类的生命周期 类的生命周期如下图…

leetcode刷题之回文链表and最长回文子串

234.回文链表 方法一:找中间结点,断开链表,后一段链表进行反转 思路:①找中间结点:使用快慢指针fast,slow,fast每次走两个,slow每次走一个; 如果链表的个数是奇数个,那么最后slow指向中间节点 如果链表的个数是偶数个,那么最后slow指向中间两个节点的后一个 ②使用prev指针保…

文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题

八、可以扩展我们的记号到有两个参数n和m的情形&#xff0c;其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n, m)&#xff0c;用O(g(n, m))来表示以下函数集&#xff1a; O(g(n, m)) { f(n, m): 存在正常量c、和&#xff0c;使得对所有n>n0或m>m0&#xff…

unity 性能优化之合批和剔除

批次对渲染的性能影响是比较大的&#xff0c;批次过多会导致cpu提交的次数过多&#xff0c;导致每帧渲染时间过长&#xff0c;所以我们需要对其优化&#xff0c;减少Bathches数量和SetPassCall次数。 批次合并的方法有多种&#xff0c;下面一一列出&#xff1a; 手动合批 将相…

CRM系统多少钱一套?盘点主流各大CRM系统价格

阅读本文你将了解&#xff1a;1.CRM定价规则&#xff1b;2.各大CRM系统报价&#xff08;CRM系统多少钱一套&#xff09;;3.CRM系统费用构成。 一、CRM定价规则 很多企业都寻求使用CRM系统来管理客户关系&#xff0c;从而优化管理流程&#xff0c;提升业绩。 对于企业而言&…

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据(无缺失)

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1985-2021年 2、范围&#xff1a;包括全国31省 3、来源&#xff1a;各省NJ、社会统计NJ、人口和就业NJ 4、指标包括&#xff1a;省第一产业就业人数、省第…

Baumer工业相机堡盟相机如何使用PixelTransformation像素转换功能(像素转换功能的使用和优点以及行业应用)(C#)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

2023年,web前端工程师20道Vue面试题及解析

本文章列出了20道关于Vue.js的面试题&#xff0c;包括基础和进阶问题&#xff0c;并提供了问题的答案及解析&#xff0c;以帮助读者更好地准备面试。从指令、生命周期函数到组件间通信和路由等各方面都作了涉及。 1. 什么是Vue.js&#xff1f;它有哪些特点&#xff1f; 答案&…

Git服务器集成(一)

本篇文章旨在分享本人在学习Git时的随笔记&#x1f929; 文章目录 Git 远程服务器1、下载 Git 软件&#xff08;linux版本&#xff09;2、安装 Git 软件2.1 解压 Git2.2 安装依赖2.3 删除旧版 Git2.4 编译、安装 Git2.5 配置环境变量2.6 建立链接文件2.7 测试安装 3、创建 Git …

使用Selenium控制Chrome浏览器 --工作自动化

使用Selenium控制Chrome浏览器 --工作自动化 背景&#xff1a; 最近朋友在用秒账做帐时&#xff0c;由于销售单量很大&#xff0c;重复录入工作一天一录就近五个小时&#xff0c;寻求帮助&#xff0c;问能不能把这重复劳动减少些&#xff0c;看后分析&#xff0c;使用web自动…

为网站的中文和英文使用不同的字体

CSS为网站的中文和英文使用不同的字体 前言 最近我在搭建个人网站&#xff0c;在这个过程中遇到很多的问题&#xff0c;不过chatGPT3.5帮助了很多&#xff0c;这是我使用的咒语&#xff1a; 我正在搭建一个个人网站&#xff0c;使用python Flask框架&#xff0c;CSS采用Boots…

linux网络设置与维护命令

文章目录 一、linux网络设置与维护命令总结 一、linux网络设置与维护命令 Linux ifconfig命令:配置或显示网络接口信息 Linux netstat命令:显示网络状态 Linux ip命令:执行网络管理任务 Linux ping命令:测试主机间网络连通性 Linux wall命令:发送广播 Linux finger命令:查找并…

ShardingJDBC的实核心流程和商户商家订单的分片实现

一、ShardingJDBC的核心流程 ShardingJDBC的核心流程主要分成六个步骤&#xff0c;分别是&#xff1a;SQL解析->SQL优化->SQL路由->SQL改写->SQL执行->结果归并&#xff0c;流程图如下: 4.1、SQL解析 分为词法解析和语法解析。 先通过词法解析器将SQL拆分为一…

基于ESP32 蓝牙游戏手柄设计

使用 ESP32 并通过 BLE 通信的 DIY 手持游戏手柄 这个项目中使用的东西 硬件组件 esp32 1 ws2812b 6 操纵杆 2 角度按钮 2 按钮 8 18560电池和电池座 2 3路拨动开关 1 TP4056带保…

【从0到1了解Libarchive】带你了解Libarchive Libarchive的用途意义以及成功入门Libarchive

目录 0 如果你还不知道Libarchive是什么请一定要先看一下 1 简介 1.1 为什么实现Libarchive 1.2 到底都有谁在用呢&#xff1f; 1.3 Libarchive都有哪些功能 1.4 我们可以通过这些获取更多信息 1.5 如何贡献 2 Libarchive归档与压缩 3 Libarchive编译 4 Libarchive简…

ApplicationContext 和 BeanFactory 的区别

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 ApplicationContext 和 BeanFactory 的区别 ApplicationContext 和 BeanFactory 的区别 那么这 2 种获取 Spring 上下文对象…

搭建electron-vue上

electron-vue 准备工作修改package.jsonappveyor.yml.travis.yml.gitignore.eslintrc.js.eslintignore.babelrcsrc/renderer/main.jssrc/renderer/App.vuesrc/renderer/store/index.jssrc/renderer/store/modules/Counter.jssrc/renderer/store/modules/Counter.jssrc/renderer…