【五一创作】Springboot+多环境+多数据源(MySQL+Phoenix)配置及查询(多知识点)
文章目录
- 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.StdOutImplmap-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: prodatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://IP:3306/WEB_SERVER?characterEncoding=utf-8&useSSL=falseusername: testpassword: 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:xxxxxxdb2:yyyyyy
我们这里的需求是mysql和phoenix两个数据源如下,并且修改了连接池为Druid:

完整内容如下:
spring:config:activate:on-profile: devdatasource:type: com.alibaba.druid.pool.DruidDataSourcedruid: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 1stat-view-servlet:enabled: true # 是否开启 StatViewServletallow: 127.0.0.1 # 访问监控页面 白名单,默认127.0.0.1deny: ip # 访问监控页面 黑名单login-username: admin # 访问监控页面 登陆账号login-password: admin # 访问监控页面 登陆密码filter:stat:enabled: true # 是否开启 FilterStat,默认truelog-slow-sql: true # 是否开启 慢SQL 记录,默认falseslow-sql-millis: 5000 # 慢 SQL 的标准,默认 3000,单位:毫秒merge-sql: false # 合并多个连接池的监控数据,默认falsewall:config:multi-statement-allow: trueweb-stat-filter:enabled: trueexclusions:- "*.js"- "*.gif"- "*.jpg"- "*.png"- "*.css"- "*.ico"- "/monitor/druid/*"mysql: # 数据源1driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://XXXXipXXXXX:3306/TEST_SERVER?characterEncoding=utf-8&useSSL=falseusername: testpassword: testmapper-locations: classpath*:mapper/mysql/*.xmlfilters: stat,walltest-on-borrow: truetest-while-idle: truevalidation-query: SELECT 1phoenix: # 数据源2driver-class-name: org.apache.phoenix.jdbc.PhoenixDriverjdbc-url: jdbc:phoenix:IP地址:2181:/hbaseusername: phoenixpassword: ""mapper-locations: classpath*:mapper/phoenix/*.xmlfilters: stattest-on-borrow: truetest-while-idle: truevalidation-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;}@Beanpublic SqlSessionFactory phoenixSqlSessionFactory(@Qualifier("phoenixDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocation));bean.setDataSource(dataSource);return bean.getObject();}@Beanpublic 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 {@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@Primarypublic 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@Primarypublic DataSourceTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean@Primarypublic SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}}
关于springboot默认的数据源自动配置选项,最好排除掉,在当时测试时是不用手工关闭的,
后来过了一天又出现找不到@Value定义的变量,所以后来又加上了。
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
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 {@Autowiredprivate GmxHotTradePhoenixMapper gmxHotTradePhoenixMapper;@Autowiredprivate GmxHotTradeMysqlMapper gmxHotTradeMysqlMapper;@Overridepublic 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请求:

相关文章:
【五一创作】Springboot+多环境+多数据源(MySQL+Phoenix)配置及查询(多知识点)
文章目录 1. 背景2. 技术点3 子模块依赖SpringBoot设置4. 多环境配置4.1 application.yml4.2 application-pro.yml 5. 多数据源配置5.1 yml配置5.2 自定义数据源在Java中配置5.2.1 PhoenixDataSourceConfig5.2.2 MysqlDataSourceConfig 6. 完整的Pom6. 测试6.1 Mapper配置6.2 方…...
Python小姿势 - 线程和进程:
线程和进程: Python里面线程是真正的并行执行,进程是可以并行执行的。 所谓进程,就是操作系统中执行一个程序的独立单元,它是系统进行资源分配和调度的基本单位。一个进程可以创建和撤销另一个进程,同一个进程内可以并…...
Mysql 锁
目录 0 课程视频 1 概述 1.1 多用户 并发访问 -> 为了数据一致性(多用户) 1.2 全局锁 数据库所有表 1.3 表级锁 每次操作 锁整张表 1.4 行级锁 每次操作 锁对应行 2 全局锁 ->锁后只读 -> 全库逻辑备份 2.1 阻塞DML /DDL 可DQL读 2.2 语法 2.2.1 加锁 flush…...
基于ssm的论坛系统的设计与实现【附源码】
基于ssm的论坛系统的设计与实现 摘 要 早期的网络论坛系统已经诞生一段时间,随着互联网技术的发展,它已经从最初的简单电子公告板系统变成了一种丰富的论坛系统社区模型。人们通过论坛系统进行信息的获取、发布和交流已经成为一种普遍的社交方式&#x…...
Vue中的事件修饰符
Vue中的事件修饰符: 1.prevent: 阻止默认事件 (常用) : 2.stop: 阻止事件冒泡 (常用) : 3.once: 事件只触发一次(常用) : 4.capture:使用事件的捕获模式: 5.self: 只有event.target是当前操作的元素是才触发事件; 6.passive:事件的默认行为立即执行,无需等待事件回调…...
如何保证Redis和数据库的一致性
关注我,升职加薪就是你! 当我们对数据进行修改的时候,到底是先删缓存,还是先写数据库? 1、如果先删缓存,再写数据库:在高并发场景下,当第一个线程删除了缓存,还没来得及写…...
Ubantu docker学习笔记(八)私有仓库
文章目录 一、建立HTTPS链接1.在仓库服务器上获取TLS证书1.1 生成证书颁发机构证书1.2 生成服务器证书1.3 利用证书运行仓库容器 2.让私有仓库支持HTTPS3.客户端端配置 二、基本身份验证三、对外隐藏仓库服务器3.1 在服务器端3.2 在客户端进行 四、仓库可视化 在前面的学习中&a…...
【五一创作】网络协议与攻击模拟-01-wireshark使用-捕获过滤器
协议 TCP/IP协议簇 网络接口层(没有特定的协议)PPPOE 物理层 数据链路层 网络层:IP (v4/v6) ARP (地址解析协议) RARP ICMP (Internet控制报文协议) IGMP 传输层:TCP(传输控制协议) UDP(用户数据报协议) 应用层:都是基于传输层协议的端口,总共端口0~65535 0~1023 HTTP—t…...
网络-IP地址(嵌入式学习)
IP地址 基本概念IPv4 五类:A B C D E特殊地址子网掩码子网号概念IPv6优势举个栗子 基本概念 IP地址是Internet中主机的标识 IP地址(Internet Protocol Address 互联网国际地址)是一种在Internet上的给主机编址的方式,它主要是为…...
一文介绍Linux EAS
能量感知调度(Energy Aware Scheduling,简称EAS)是目前Android手机中Linux线程调度器的基础功能,它使调度器能预测其决策对CPU能耗的影响。依靠CPU的能量模型(Energy Model,简称EM),…...
【五一创作】【Midjourney】Midjourney 连续性人物创作 ① ( 通过垫图方式生成类似图像 )
文章目录 一、Midjourney 生成图像二、通过垫图方式生成类似图像 一、Midjourney 生成图像 Midjourney 可以生成高质量的图像 , 但是 生成过程有很大的随机性 , 输入同样的提示词指令 , 其输出结果也存在很大的不同 ; 如果要 生成稳定的人物角色 , 场景 , 描述连贯的内容 , 这…...
牛客刷题错题记录【03】
链接:https://www.nowcoder.com/questionTerminal/8242fbf4b3a241219989b3e1d0ee82db 来源:牛客网 下列关于Vue和React的描述错误的是( Vue进行数据拦截/代理,对数据更敏感,数据驱动视图自更新,而React需…...
maven-gpg-plugin gpg禁用交互式输入密码 免密码输入 设置默认密码 关闭pinentry-qt输入 passphrase
一、问题描述 在使用maven-gpg-plugin打包jar时,默认情况下,每次都会弹出对话框要你输入密码: 这就有点烦,有啥办法可以设置默认方法没?网上找了一圈,通过搜索关键词“passphrase”,找到了一些教程&#x…...
急需国产化替代的重要的工程软件有哪些?
急需国产化替代的重要的工程软件有哪些? 软件一:AutoCAD等领域常用设计软件 AutoCAD由Autodesk公司开发的工程辅助设计软件,目前是设计领域 最重要的工程软件。在高端3D的CAD领域,国产软件几乎全军覆没,在中 低端还有…...
计算机组成原理 4.2.1存储芯片连接
连接原理 主存储器 通过数据总线、地址总线和控制总线和CPU相连数据总线的位数正比于数据传输率地址总线的位数决定可寻址的最大地址空间控制总线(读/写)指出总线周期的类型和本次输入/输出完成的时刻 但是实际中存储芯片往往很小难以满足地址和数据的位数需求,此…...
这份【互联网项目全流程表】,实在是泰裤辣!!!
互联网行业是一个快速变化的行业,作为半个互联网人。太明白用户和环境每天都在不停地变化是什么感受了。 从项目开始到项目结束,要经历立项、计划、执行、结项,项目一周一个,一周一个。(**的)为了省时间…...
JAVA医院管理云HIS统计报表子系统、系统管理字系统功能实现
一、统计报表子系统 统计报表子系统功能模块:包括门诊收入汇总、住院收入汇总、收费统计报表、收费明细报表、 缴款日报、门诊收费汇总、住院科室日志、住院结算汇总、医疗项目统计、检查项目统计、 检验项目统计、月末收支汇总、药品进销存统计。 (1…...
5.Java中抽象类和接口
抽象类与接口 相同不同先从抽象类说起再从接口说起 相同 1.两者都不能实例化,因为他们都不全。(例如可以实例化一个苹果,但是不能实例化水果) 2.一个类可以实现多个接口,但是只能继承一个抽象类 3.如果这个类实现了接…...
中国平安将在2023年出现转机,复苏才刚刚开始
来源:猛兽财经 作者:猛兽财经 在解封后股价出现短暂反弹之后,由于市场担忧中国平安(02318)人寿保险部门新业务NBV(用于衡量寿险公司新业务价值的一个重要指标,当一家保险公司的NBV指标越高,那么说明每新增…...
CUDA编程(六):代码分析与调试
CUDA编程(六):代码分析与调试 代码分析与调试方法使用printf打印变量信息使用CUDA的错误检查功能使用CUDA-GDB进行调试使用Nsight进行调试使用nvprof / nvvp工具 参考文献 代码分析与调试方法 CUDA代码的运行时可能会遇到内存溢出、内存非法…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...

