• springboot:整合其它项目


    目录

    一、集成Druid

    application.yml

    二、集成redis之非注解式开发

    pom.xml

    application.yml

    RedisConfig 

    ClazzBizImpl.java

    三、集成redis之注解缓存开发

    RedisConfig 

     RedisConfig 


    一、集成Druid

    在昨天的基础上

    参考网址

    https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

    添加pom依赖

    1. <dependency>
    2. <groupId>com.alibabagroupId>
    3. <artifactId>druid-spring-boot-starterartifactId>
    4. <version>1.1.10version>
    5. dependency>

    配置

    application.yml

    1. mybatis:
    2. mapper-locations: classpath:mappers/*xml
    3. type-aliases-package: com.cdl.springboot04.model
    4. server:
    5. port: 8080
    6. servlet:
    7. context-path: /springboot04
    8. spring:
    9. application:
    10. name: springboot04
    11. datasource:
    12. driver-class-name: com.mysql.jdbc.Driver
    13. name: defaultDataSource
    14. password: 123456
    15. url: jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    16. username: root
    17. type: com.alibaba.druid.pool.DruidDataSource
    18. druid:
    19. #2.连接池配置
    20. #初始化连接池的连接数量 大小,最小,最大
    21. initial-size: 5
    22. min-idle: 5
    23. max-active: 20
    24. #配置获取连接等待超时的时间
    25. max-wait: 60000
    26. #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    27. time-between-eviction-runs-millis: 60000
    28. # 配置一个连接在池中最小生存的时间,单位是毫秒
    29. min-evictable-idle-time-millis: 30000
    30. validation-query: SELECT 1 FROM DUAL
    31. test-while-idle: true
    32. test-on-borrow: true
    33. test-on-return: false
    34. # 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
    35. pool-prepared-statements: true
    36. max-pool-prepared-statement-per-connection-size: 20
    37. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    38. filter:
    39. stat:
    40. merge-sql: true
    41. slow-sql-millis: 5000
    42. #3.基础监控配置
    43. web-stat-filter:
    44. enabled: true
    45. url-pattern: /*
    46. #设置不统计哪些URL
    47. exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
    48. session-stat-enable: true
    49. session-stat-max-count: 100
    50. stat-view-servlet:
    51. enabled: true
    52. url-pattern: /druid/*
    53. reset-enable: true
    54. #设置监控页面的登录名和密码
    55. login-username: admin
    56. login-password: admin
    57. allow: 127.0.0.1
    58. #deny: 192.168.1.100
    59. freemarker:
    60. cache: false
    61. charset: utf-8
    62. expose-request-attributes: true
    63. expose-session-attributes: true
    64. suffix: .ftl
    65. template-loader-path: classpath:/templates/
    66. # resources:
    67. # static-locations: classpath:/static/# 应用服务 WEB 访问端口
    68. mvc:
    69. static-path-pattern: classpath:/static/
    70. pagehelper:
    71. reasonable: true
    72. supportMethodsArguments: true
    73. page-size-zero: true
    74. helper-dialect: mysql
    75. logging:
    76. level:
    77. com.cdl.springboot04: debug

    运行启动类

    打开我们的班级列表

     通过手动输入druid的登录界面

     登录之后

     当我们对班级列表进行操作时,例如增加

     此时SQL监控,URL监控

    若增加一个重复的id 则URL监控就显示error

     

    二、集成redis之非注解式开发

    添加需要的pom依赖

    
    
        org.springframework.boot
        spring-boot-starter-data-redis
    

    pom.xml

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.cdlgroupId>
    6. <artifactId>springboot04artifactId>
    7. <version>0.0.1-SNAPSHOTversion>
    8. <name>springboot04name>
    9. <description>Demo project for Spring Bootdescription>
    10. <properties>
    11. <java.version>1.8java.version>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    14. <spring-boot.version>2.3.7.RELEASEspring-boot.version>
    15. properties>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.bootgroupId>
    19. <artifactId>spring-boot-starter-freemarkerartifactId>
    20. dependency>
    21. <dependency>
    22. <groupId>org.springframework.bootgroupId>
    23. <artifactId>spring-boot-starter-jdbcartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>org.springframework.bootgroupId>
    27. <artifactId>spring-boot-starter-webartifactId>
    28. dependency>
    29. <dependency>
    30. <groupId>org.mybatis.spring.bootgroupId>
    31. <artifactId>mybatis-spring-boot-starterartifactId>
    32. <version>2.1.4version>
    33. dependency>
    34. <dependency>
    35. <groupId>mysqlgroupId>
    36. <artifactId>mysql-connector-javaartifactId>
    37. <version>5.1.44version>
    38. dependency>
    39. <dependency>
    40. <groupId>org.springframeworkgroupId>
    41. <artifactId>spring-aspectsartifactId>
    42. <version>5.0.2.RELEASEversion>
    43. dependency>
    44. <dependency>
    45. <groupId>com.github.pagehelpergroupId>
    46. <artifactId>pagehelper-spring-boot-starterartifactId>
    47. <version>1.2.3version>
    48. dependency>
    49. <dependency>
    50. <groupId>com.alibabagroupId>
    51. <artifactId>druid-spring-boot-starterartifactId>
    52. <version>1.1.10version>
    53. dependency>
    54. <dependency>
    55. <groupId>org.springframework.bootgroupId>
    56. <artifactId>spring-boot-starter-data-redisartifactId>
    57. dependency>
    58. <dependency>
    59. <groupId>org.projectlombokgroupId>
    60. <artifactId>lombokartifactId>
    61. <optional>trueoptional>
    62. dependency>
    63. <dependency>
    64. <groupId>org.springframework.bootgroupId>
    65. <artifactId>spring-boot-starter-testartifactId>
    66. <scope>testscope>
    67. <exclusions>
    68. <exclusion>
    69. <groupId>org.junit.vintagegroupId>
    70. <artifactId>junit-vintage-engineartifactId>
    71. exclusion>
    72. exclusions>
    73. dependency>
    74. dependencies>
    75. <dependencyManagement>
    76. <dependencies>
    77. <dependency>
    78. <groupId>org.springframework.bootgroupId>
    79. <artifactId>spring-boot-dependenciesartifactId>
    80. <version>${spring-boot.version}version>
    81. <type>pomtype>
    82. <scope>importscope>
    83. dependency>
    84. dependencies>
    85. dependencyManagement>
    86. <build>
    87. <plugins>
    88. <plugin>
    89. <groupId>org.apache.maven.pluginsgroupId>
    90. <artifactId>maven-compiler-pluginartifactId>
    91. <version>3.8.1version>
    92. <configuration>
    93. <source>1.8source>
    94. <target>1.8target>
    95. <encoding>UTF-8encoding>
    96. configuration>
    97. plugin>
    98. <plugin>
    99. <groupId>org.springframework.bootgroupId>
    100. <artifactId>spring-boot-maven-pluginartifactId>
    101. <version>2.3.7.RELEASEversion>
    102. <configuration>
    103. <mainClass>com.cdl.springboot04.Springboot04ApplicationmainClass>
    104. configuration>
    105. <executions>
    106. <execution>
    107. <id>repackageid>
    108. <goals>
    109. <goal>repackagegoal>
    110. goals>
    111. execution>
    112. executions>
    113. plugin>
    114. plugins>
    115. build>
    116. project>

    配置

    application.yml

    1. mybatis:
    2. mapper-locations: classpath:mappers/*xml
    3. type-aliases-package: com.cdl.springboot04.model
    4. server:
    5. port: 8080
    6. servlet:
    7. context-path: /springboot04
    8. spring:
    9. application:
    10. name: springboot04
    11. datasource:
    12. driver-class-name: com.mysql.jdbc.Driver
    13. name: defaultDataSource
    14. password: 123456
    15. url: jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    16. username: root
    17. type: com.alibaba.druid.pool.DruidDataSource
    18. druid:
    19. #2.连接池配置
    20. #初始化连接池的连接数量 大小,最小,最大
    21. initial-size: 5
    22. min-idle: 5
    23. max-active: 20
    24. #配置获取连接等待超时的时间
    25. max-wait: 60000
    26. #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    27. time-between-eviction-runs-millis: 60000
    28. # 配置一个连接在池中最小生存的时间,单位是毫秒
    29. min-evictable-idle-time-millis: 30000
    30. validation-query: SELECT 1 FROM DUAL
    31. test-while-idle: true
    32. test-on-borrow: true
    33. test-on-return: false
    34. # 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
    35. pool-prepared-statements: true
    36. max-pool-prepared-statement-per-connection-size: 20
    37. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
    38. filter:
    39. stat:
    40. merge-sql: true
    41. slow-sql-millis: 5000
    42. #3.基础监控配置
    43. web-stat-filter:
    44. enabled: true
    45. url-pattern: /*
    46. #设置不统计哪些URL
    47. exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
    48. session-stat-enable: true
    49. session-stat-max-count: 100
    50. stat-view-servlet:
    51. enabled: true
    52. url-pattern: /druid/*
    53. reset-enable: true
    54. #设置监控页面的登录名和密码
    55. login-username: admin
    56. login-password: admin
    57. allow: 127.0.0.1
    58. #deny: 192.168.1.100
    59. freemarker:
    60. cache: false
    61. charset: utf-8
    62. expose-request-attributes: true
    63. expose-session-attributes: true
    64. suffix: .ftl
    65. template-loader-path: classpath:/templates/
    66. # resources:
    67. # static-locations: classpath:/static/# 应用服务 WEB 访问端口
    68. mvc:
    69. static-path-pattern: classpath:/static/
    70. redis:
    71. host: 192.168.26.128
    72. port: 6379
    73. database: 0
    74. password: 123456
    75. pagehelper:
    76. reasonable: true
    77. supportMethodsArguments: true
    78. page-size-zero: true
    79. helper-dialect: mysql
    80. logging:
    81. level:
    82. com.cdl.springboot04: debug

    新建一个包 config 配置类

    RedisConfig 

    1. package com.cdl.springboot04.config;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.data.redis.connection.RedisConnectionFactory;
    5. import org.springframework.data.redis.core.RedisTemplate;
    6. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    7. import org.springframework.data.redis.serializer.StringRedisSerializer;
    8. /**
    9. * @author CDL
    10. * @site www.cdl.com
    11. *
    12. * @Configuration:凡是被@Configuration注解所标记,就代表当前这个类为配置类
    13. * 而配置类等价于ssm阶段中spring-*.xml这一类的配置文件
    14. *
    15. * spring-*.xml中:
    16. * @Bean代表某个类交给spring进行管理
    17. *
    18. *
    19. *
    20. */
    21. @Configuration
    22. public class RedisConfig {
    23. @Bean
    24. public RedisTemplate getRedisTemplate(RedisConnectionFactory connectionFactory){
    25. RedisTemplate redisTemplate = new RedisTemplate<>();
    26. //配置序列化器 针对于key 针对于value
    27. redisTemplate.setKeySerializer(new StringRedisSerializer());
    28. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    29. redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    30. redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    31. // redisTemplate.afterPropertiesSet();根据redis的版本考虑要不要让其生效
    32. //ConnectionFactory是包含了redis的连接信息
    33. redisTemplate.setConnectionFactory(connectionFactory);
    34. return redisTemplate;
    35. }
    36. }

    在service层ClazzBizImpl.java使用

    ClazzBizImpl.java

    1. package com.cdl.springboot04.biz.impl;
    2. import com.cdl.springboot04.biz.ClazzBiz;
    3. import com.cdl.springboot04.mapper.ClazzMapper;
    4. import com.cdl.springboot04.model.Clazz;
    5. import com.cdl.springboot04.util.PageBean;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.data.redis.core.RedisTemplate;
    8. import org.springframework.stereotype.Service;
    9. import java.util.List;
    10. import java.util.Map;
    11. /**
    12. * @author CDL
    13. * @site www.cdl.com
    14. * @company xxx公司
    15. * @create  2022-08-17 15:13
    16. */
    17. @Service
    18. public class ClazzBizImpl implements ClazzBiz {
    19. @Autowired
    20. private ClazzMapper clazzMapper;
    21. @Autowired
    22. private RedisTemplate redisTemplate;
    23. @Override
    24. public int deleteByPrimaryKey(Integer cid) {
    25. // System.out.println("不做任何操作...");
    26. return clazzMapper.deleteByPrimaryKey(cid);
    27. // return 0;
    28. }
    29. @Override
    30. public int insert(Clazz record) {
    31. return clazzMapper.insert(record);
    32. }
    33. @Override
    34. public int insertSelective(Clazz record) {
    35. return clazzMapper.insertSelective(record);
    36. }
    37. @Override
    38. public Clazz selectByPrimaryKey(Integer cid) {
    39. return clazzMapper.selectByPrimaryKey(cid);
    40. }
    41. @Override
    42. public int updateByPrimaryKeySelective(Clazz record) {
    43. return clazzMapper.updateByPrimaryKeySelective(record);
    44. }
    45. @Override
    46. public int updateByPrimaryKey(Clazz record) {
    47. return clazzMapper.updateByPrimaryKey(record);
    48. }
    49. @Override
    50. public List listPager(Clazz clazz, PageBean pageBean) {
    51. //将班级缓存到redis中
    52. List clzs = clazzMapper.listPager(clazz);
    53. // redisTemplate.opsForValue().set("clz:1",clzs.get(0));
    54. redisTemplate.opsForValue().set("clzs",clzs);
    55. // redisTemplate.opsForHash().entries();
    56. return clzs;
    57. }
    58. @Override
    59. public List listMapPager(Clazz clazz, PageBean pageBean) {
    60. if(true)
    61. throw new RuntimeException("查询班级信息异常,异常存在于ClazzBizImpl.list。。。。");
    62. return clazzMapper.listMapPager(clazz);
    63. }
    64. }

    运行:

     此时:可见已经缓存进去了

    三、集成redis之注解缓存开发

    还要在配置类配置缓存管理器

    RedisConfig 

    1. package com.cdl.springboot04.config;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.data.redis.cache.RedisCacheConfiguration;
    5. import org.springframework.data.redis.cache.RedisCacheManager;
    6. import org.springframework.data.redis.connection.RedisConnectionFactory;
    7. import org.springframework.data.redis.core.RedisTemplate;
    8. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    9. import org.springframework.data.redis.serializer.RedisSerializationContext;
    10. import org.springframework.data.redis.serializer.StringRedisSerializer;
    11. import java.time.Duration;
    12. import java.util.HashMap;
    13. import java.util.HashSet;
    14. import java.util.Map;
    15. import java.util.Set;
    16. /**
    17. * @author CDL
    18. * @site www.cdl.com
    19. *
    20. * @Configuration:凡是被@Configuration注解所标记,就代表当前这个类为配置类
    21. * 而配置类等价于ssm阶段中spring-*.xml这一类的配置文件
    22. *
    23. * spring-*.xml中:
    24. * @Bean代表某个类交给spring进行管理
    25. *
    26. *
    27. *
    28. */
    29. @Configuration
    30. public class RedisConfig {
    31. private final int defaultExpireTime = 600;//默认的缓存槽
    32. private final int userCacheExpireTime = 60;//用来缓存用户的槽
    33. private final String userCacheName = "test";//用户槽的名称
    34. @Bean
    35. public RedisTemplate getRedisTemplate(RedisConnectionFactory connectionFactory){
    36. RedisTemplate redisTemplate = new RedisTemplate<>();
    37. //配置序列化器 针对于key 针对于value
    38. redisTemplate.setKeySerializer(new StringRedisSerializer());
    39. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    40. redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    41. redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    42. // redisTemplate.afterPropertiesSet();根据redis的版本考虑要不要让其生效
    43. //ConnectionFactory是包含了redis的连接信息
    44. redisTemplate.setConnectionFactory(connectionFactory);
    45. return redisTemplate;
    46. }
    47. @Bean//配置缓存管理器
    48. public RedisCacheManager redis(RedisConnectionFactory connectionFactory){
    49. RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
    50. // 设置缓存管理器管理的缓存的默认过期时间
    51. defaultCacheConfig = defaultCacheConfig.entryTtl(Duration.ofSeconds(defaultExpireTime))
    52. // 设置 key为string序列化
    53. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
    54. // 设置value为json序列化
    55. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
    56. // 不缓存空值
    57. .disableCachingNullValues();
    58. Set cacheNames = new HashSet<>();
    59. cacheNames.add(userCacheName);
    60. // 对每个缓存空间应用不同的配置
    61. Map configMap = new HashMap<>();
    62. configMap.put(userCacheName, defaultCacheConfig.entryTtl(Duration.ofSeconds(userCacheExpireTime)));
    63. RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
    64. .cacheDefaults(defaultCacheConfig)
    65. .initialCacheNames(cacheNames)
    66. .withInitialCacheConfigurations(configMap)
    67. .build();
    68. return cacheManager;
    69. }
    70. }

    将非注解式缓存的Java代码注掉

     RedisConfig 

    1. package com.cdl.springboot04.config;
    2. import org.springframework.cache.annotation.EnableCaching;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. import org.springframework.data.redis.cache.RedisCacheConfiguration;
    6. import org.springframework.data.redis.cache.RedisCacheManager;
    7. import org.springframework.data.redis.connection.RedisConnectionFactory;
    8. import org.springframework.data.redis.core.RedisTemplate;
    9. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    10. import org.springframework.data.redis.serializer.RedisSerializationContext;
    11. import org.springframework.data.redis.serializer.StringRedisSerializer;
    12. import java.time.Duration;
    13. import java.util.HashMap;
    14. import java.util.HashSet;
    15. import java.util.Map;
    16. import java.util.Set;
    17. /**
    18. * @author CDL
    19. * @site www.cdl.com
    20. *
    21. * @Configuration:凡是被@Configuration注解所标记,就代表当前这个类为配置类
    22. * 而配置类等价于ssm阶段中spring-*.xml这一类的配置文件
    23. *
    24. * spring-*.xml中:
    25. * @Bean代表某个类交给spring进行管理
    26. *
    27. *
    28. *@EnableCaching 替代了下面的配置
    29. *
    30. */
    31. @EnableCaching//开启缓存
    32. @Configuration
    33. public class RedisConfig {
    34. private final int defaultExpireTime = 600;//默认的缓存槽
    35. private final int userCacheExpireTime = 60;//用来缓存用户的槽
    36. private final String userCacheName = "test";//用户槽的名称
    37. @Bean
    38. public RedisTemplate getRedisTemplate(RedisConnectionFactory connectionFactory){
    39. RedisTemplate redisTemplate = new RedisTemplate<>();
    40. //配置序列化器 针对于key 针对于value
    41. redisTemplate.setKeySerializer(new StringRedisSerializer());
    42. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    43. redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    44. redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    45. // redisTemplate.afterPropertiesSet();根据redis的版本考虑要不要让其生效
    46. //ConnectionFactory是包含了redis的连接信息
    47. redisTemplate.setConnectionFactory(connectionFactory);
    48. return redisTemplate;
    49. }
    50. @Bean//配置缓存管理器
    51. public RedisCacheManager redis(RedisConnectionFactory connectionFactory){
    52. RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
    53. // 设置缓存管理器管理的缓存的默认过期时间
    54. defaultCacheConfig = defaultCacheConfig.entryTtl(Duration.ofSeconds(defaultExpireTime))
    55. // 设置 key为string序列化
    56. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
    57. // 设置value为json序列化
    58. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
    59. // 不缓存空值
    60. .disableCachingNullValues();
    61. Set cacheNames = new HashSet<>();
    62. cacheNames.add(userCacheName);
    63. // 对每个缓存空间应用不同的配置
    64. Map configMap = new HashMap<>();
    65. configMap.put(userCacheName, defaultCacheConfig.entryTtl(Duration.ofSeconds(userCacheExpireTime)));
    66. RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
    67. .cacheDefaults(defaultCacheConfig)
    68. .initialCacheNames(cacheNames)
    69. .withInitialCacheConfigurations(configMap)
    70. .build();
    71. return cacheManager;
    72. }
    73. }

     测试查询单个能不能缓存进去

    给查询单个的方法添加注解

     在ClazzController中添加一个查询单个的方法

    1. @ResponseBody
    2. @RequestMapping("/load")
    3. public Clazz load(Clazz clazz, HttpServletRequest request){
    4. return clazzBiz.selectByPrimaryKey(clazz.getCid());
    5. }

    启动前先将redis中的数据清空

     访问数据

     缓存成功

     换个槽看下 时间

     查看单个

     缓存

     

     

  • 相关阅读:
    1382. 将二叉搜索树变平衡 ●●
    进程和线程概念和区别详解
    洛谷刷题C语言:远古档案馆(Ancient Archive)、VOLIM、SAHOVNICA、Tuna、KRIŽALJKA
    Android 11.0 系统Settings去掉开发者模式功能
    SSM宾馆客房管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
    谷歌Colab配置 运行python项目 教程
    Nginx 前端 安装,打包,发布项目到服务 流程
    SSL VPN综合实验
    团队管理|如何提高技术 Leader 的思考技巧?
    金仓数据库 KingbaseES 插件DBMS_RANDOM
  • 原文地址:https://blog.csdn.net/weixin_62735525/article/details/127654476