Spring Boot 与 TDengine 的深度集成实践(四)
优化与扩展
批量插入数据
在实际应用中,当需要插入大量数据时,逐条插入会导致性能低下,因为每次插入都需要建立数据库连接、解析 SQL 语句等操作,这些操作会带来额外的开销 。为了提高数据插入效率,我们可以采用批量插入数据的方式 。
在 Spring Boot 中使用 Spring Data JPA 进行批量插入时,可以利用JpaRepository提供的saveAll方法 。例如,假设我们有一个SensorData实体类的列表sensorDataList,其中包含多条需要插入的传感器数据记录,我们可以在SensorDataService服务层中进行如下操作:
import com.example.springboottdengineintegration.dao.SensorDataRepository;
import com.example.springboottdengineintegration.entity.SensorData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class SensorDataService {
private final SensorDataRepository sensorDataRepository;
@Autowired
public SensorDataService(SensorDataRepository sensorDataRepository) {
this.sensorDataRepository = sensorDataRepository;
}
@Transactional
public void batchInsertSensorData(List<SensorData> sensorDataList) {
sensorDataRepository.saveAll(sensorDataList);
}
}
在上述代码中:
- @Transactional注解用于声明该方法是一个事务性方法,确保批量插入操作的原子性。如果在插入过程中出现任何异常,整个插入操作将回滚,保证数据的一致性 。例如,如果在插入第 5 条数据时出现错误,由于事务的存在,前面已经插入的 4 条数据也会被回滚,数据库中不会残留部分插入的数据 。
- sensorDataRepository.saveAll(sensorDataList)方法接受一个SensorData实体类的列表作为参数,将列表中的所有数据一次性批量插入到 TDengine 数据库中 。相比逐条插入,这种方式大大减少了数据库连接和 SQL 解析的次数,提高了插入效率 。
如果使用 MyBatis 进行批量插入,可以在 Mapper 接口中定义批量插入的方法,并在 XML 文件中编写对应的 SQL 语句 。例如,在SensorDataMapper接口中添加如下方法:
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SensorDataMapper {
@Insert({"<script>",
"INSERT INTO sensor_data (sensor_id, value, timestamp)",
"VALUES",
"<foreach collection='sensorDataList' item='data' separator=','>",
"(#{data.sensorId}, #{data.value}, #{data.timestamp})",
"</foreach>",
"</script>"})
void batchInsertSensorData(@Param("sensorDataList") List<SensorData> sensorDataList);
}
在上述代码中:
- @Insert注解中的 SQL 语句使用了<script>标签,这是 MyBatis 提供的一种动态 SQL 语法,用于编写复杂的 SQL 语句 。
- <foreach>标签用于遍历sensorDataList列表,将列表中的每个SensorData对象的属性值插入到 SQL 语句中。collection属性指定要遍历的集合,item属性指定集合中每个元素的别名,separator属性指定元素之间的分隔符 。通过这种方式,生成的 SQL 语句会包含多个VALUES子句,一次性插入多条数据 。
在使用批量插入时,需要注意数据量的大小 。如果数据量过大,可能会导致内存占用过高或 SQL 语句过长,从而影响性能甚至导致插入失败 。此时,可以将数据分批进行插入,例如每次插入 1000 条数据,以平衡性能和内存使用 。
数据订阅与消费
TDengine 提供了数据订阅服务,类似于消息队列的数据发布 / 订阅模式,这使得应用能够实时获取写入 TDengine 的数据,或者以事件到达顺序处理数据 。在许多场景下,采用 TDengine 的数据订阅功能可以简化系统设计,不再需要集成额外的消息队列产品,如 Kafka,从而降低运营维护成本 。
在 Java 中使用 TDengine 的数据订阅功能,首先需要添加 TDengine 的 Java SDK 依赖(如果之前未添加) 。然后,可以使用 TDengine 提供的 API 来实现数据订阅与消费 。以下是一个简单的示例代码:
import com.taosdata.jdbc.TSDBDriver;
import com.taosdata.tmq.Consumer;
import com.taosdata.tmq.ConsumerConfig;
import com.taosdata.tmq.Message;
import com.taosdata.tmq.MessageListener;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Properties;
public class TDengineSubscriptionExample {
public static void main(String[] args) {
// 配置TDengine连接信息
String url = "jdbc:TAOS://localhost:6030/your_database_name";
String user = "root";
String password = "taosdata";
// 配置消费者属性
Properties props = new Properties();
props.put(ConsumerConfig.GROUP_ID_CONFIG, "test_group");
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:6030");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
try {
// 注册TDengine JDBC驱动
DriverManager.registerDriver(new TSDBDriver());
// 创建消费者
Consumer consumer = new Consumer(props);
// 订阅主题,主题可以基于超级表、子表或普通表的查询条件创建
consumer.subscribe(Arrays.asList("your_topic_name"));
// 设置消息监听器,处理接收到的消息
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
// 处理接收到的数据
System.out.println("Received message: " + message.value());
}
});
// 持续拉取消息
while (true) {
consumer.poll(100);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭消费者
consumer.close();
}
}
}
在上述代码中:
- 首先配置了 TDengine 的连接信息,包括 URL、用户名和密码 。
- 然后设置了消费者的属性,其中GROUP_ID_CONFIG指定了消费者组 ID,同一消费者组内的消费者共享消费进度;BOOTSTRAP_SERVERS_CONFIG指定了 TDengine 服务器的地址和端口;AUTO_OFFSET_RESET_CONFIG设置为earliest,表示从最早的消息开始消费,如果设置为latest,则从最新的消息开始消费 。
- 使用DriverManager.registerDriver(new TSDBDriver())注册 TDengine 的 JDBC 驱动 。
- 创建Consumer对象,并使用consumer.subscribe(Arrays.asList("your_topic_name"))方法订阅指定的主题 。主题可以通过CREATE TOPIC语句基于超级表、子表或普通表的查询条件创建,例如CREATE TOPIC topic_name AS SELECT * FROM sensor_data,这样就可以实时获取sensor_data表中的数据 。
- 通过consumer.setMessageListener设置消息监听器,在onMessage方法中处理接收到的消息 。
- 使用consumer.poll(100)方法持续拉取消息,参数100表示拉取消息的超时时间(单位为毫秒) 。
通过以上方式,我们可以实现对 TDengine 中数据的实时订阅与消费,满足实时数据处理的需求,例如在物联网实时监控场景中,能够及时获取传感器上传的最新数据并进行处理 。
性能优化
在 Spring Boot 与 TDengine 集成的项目中,为了提高系统的整体性能,我们可以从多个方面进行优化,包括索引优化、连接池配置等 。
索引优化:合理的索引设计可以显著提高查询性能 。在 TDengine 中,索引主要用于加速数据的查询操作 。对于经常查询的字段,应该创建适当的索引 。例如,如果我们经常根据sensorId查询传感器数据,可以在sensor_data表的sensorId字段上创建索引 。在 TDengine 中,可以使用以下 SQL 语句创建索引:
CREATE INDEX idx_sensor_id ON sensor_data(sensor_id);
在上述 SQL 语句中,CREATE INDEX用于创建索引,idx_sensor_id是索引名,ON关键字后面指定要创建索引的表名,括号内是要创建索引的字段名 。通过创建这个索引,当执行基于sensorId的查询时,TDengine 可以更快地定位到相关数据,减少全表扫描的开销 。需要注意的是,虽然索引可以提高查询性能,但也会增加数据插入和更新的开销,因为每次插入或更新数据时,数据库都需要维护索引结构 。因此,在创建索引时,要权衡查询性能和写入性能,避免创建过多不必要的索引 。
连接池配置:在 Spring Boot 项目中,使用连接池可以减少数据库连接的创建和销毁次数,提高数据库连接的复用率,从而提升系统性能 。Spring Boot 默认使用 HikariCP 连接池,我们可以在application.properties或application.yml文件中对其进行配置 。例如,在application.properties文件中,可以配置以下参数:
# 最大连接数
spring.datasource.hikari.maximum-pool-size=100
# 最小空闲连接数
spring.datasource.hikari.minimum-idle=10
# 连接超时时间(毫秒)
spring.datasource.hikari.connection-timeout=30000
在上述配置中:
- spring.datasource.hikari.maximum-pool-size设置了连接池的最大连接数,这里设置为 100,表示连接池最多可以同时维护 100 个数据库连接 。如果应用程序对数据库的并发访问量较大,可以适当增大这个值,但也要注意服务器的资源限制,避免过多的连接占用过多的系统资源 。
- spring.datasource.hikari.minimum-idle设置了连接池的最小空闲连接数,这里设置为 10,表示连接池会尽量保持 10 个空闲连接,以便快速响应新的数据库请求 。如果应用程序的数据库访问量比较稳定,可以根据实际情况调整这个值,以平衡资源利用和响应速度 。
- spring.datasource.hikari.connection-timeout设置了获取连接的超时时间,这里设置为 30000 毫秒(即 30 秒) 。如果在这个时间内无法从连接池获取到可用连接,会抛出异常 。根据应用程序的实际情况,可以适当调整这个超时时间,以避免因获取连接超时导致的业务异常 。
除了 HikariCP,还有其他连接池可供选择,如 C3P0、DBCP 等 。不同的连接池在性能、功能和配置上可能会有所差异 。例如,C3P0 提供了更多的配置选项和监控功能,DBCP 则相对简单易用 。在实际项目中,可以根据项目的需求和特点选择合适的连接池,并进行合理的配置 。
通过以上索引优化和连接池配置等性能优化措施,可以有效提升 Spring Boot 与 TDengine 集成项目的性能,使其能够更好地应对高并发、大数据量的业务场景 。
总结与展望
总结集成过程
在本次 Spring Boot 与 TDengine 的集成实践中,我们经历了多个关键步骤。首先进行环境准备,安装并配置好 Java、Maven 和 TDengine,为后续开发搭建起基础平台。接着,通过 Spring Initializr 快速创建 Spring Boot 项目,清晰了解项目结构,为代码组织和管理奠定基础 。在添加 TDengine 依赖后,我们顺利在pom.xml文件中引入了 JDBC 驱动和 Java SDK 依赖,使项目具备与 TDengine 交互的能力 。
数据库连接配置是关键一步,在application.properties或application.yml文件中准确配置连接 URL、用户名、密码和驱动类名,确保 Spring Boot 应用能成功连接到 TDengine 数据库 。创建数据模型时,定义与 TDengine 表对应的实体类,并运用 JPA 注解实现精准映射 。编写 DAO 层时,既可以选择使用 Spring Data JPA 简洁的接口方式,也可以使用 MyBatis 灵活的 SQL 编写方式,还能根据业务需求自定义各种查询方法 。创建 RESTful API 时,通过编写控制器类,实现对 TDengine 数据的增删改查操作,为前端应用或其他后端服务提供便捷的数据接口 。在测试 API 阶段,使用 Postman 进行全面测试,根据测试结果分析并解决可能出现的各种问题,确保 API 的稳定性和正确性 。最后,在优化与扩展部分,通过批量插入数据、数据订阅与消费以及性能优化等措施,进一步提升系统的性能和功能 。
展望未来应用
未来,Spring Boot 与 TDengine 的集成方案有着广阔的应用前景 。在工业物联网领域,随着智能制造的发展,生产线上的设备数量不断增加,产生的时序数据量呈爆炸式增长 。该集成方案可以实时采集设备的运行数据,如温度、压力、转速等,通过数据分析实现设备故障预测和预防性维护,提高生产效率,降低设备故障率,减少生产损失 。在智能电网领域,电力系统中的各种传感器和智能电表会产生海量的电力数据,包括电压、电流、功率等 。利用 Spring Boot 与 TDengine 的集成,可以对这些数据进行高效存储和分析,实现电力负荷预测、电网状态监测和能源管理优化,提高电网的稳定性和能源利用效率 。
在智能交通领域,交通流量监测设备、车辆定位系统等会产生大量的交通数据 。通过集成方案,能够实时获取交通流量、车辆位置等信息,进行交通拥堵预测和智能交通调度,缓解交通拥堵,提高交通安全性 。在金融领域,股票价格、交易数据等金融时序数据对市场分析和投资决策至关重要 。Spring Boot 与 TDengine 的集成可以实现对金融数据的快速处理和分析,为投资者提供及时准确的市场信息,辅助投资决策 。
为了更好地适应未来的发展需求,我们还可以进一步优化和扩展该集成方案 。在性能优化方面,持续探索更高效的索引策略和查询优化方法,以应对不断增长的数据量和复杂的查询需求 。在功能扩展方面,结合大数据分析、人工智能等技术,实现对时序数据的深度挖掘和智能分析,为业务决策提供更有价值的支持 。相信随着技术的不断发展和应用场景的不断拓展,Spring Boot 与 TDengine 的集成将在更多领域发挥重要作用,为各行业的数字化转型提供强大的技术支持 。
相关文章:
Spring Boot 与 TDengine 的深度集成实践(四)
优化与扩展 批量插入数据 在实际应用中,当需要插入大量数据时,逐条插入会导致性能低下,因为每次插入都需要建立数据库连接、解析 SQL 语句等操作,这些操作会带来额外的开销 。为了提高数据插入效率,我们可以采用批量…...
2025年【山东省安全员C证】考试题及山东省安全员C证考试内容
在当今建筑行业蓬勃发展的背景下,安全生产已成为企业生存与发展的基石。安全员作为施工现场安全管理的直接责任人,其专业能力和资质认证显得尤为重要。山东省安全员C证作为衡量安全员专业水平的重要标准,不仅关乎个人职业发展,更直…...
提升Spring Boot开发效率的Idea插件:Spring Boot Helper
一、Spring Boot Helper插件介绍 Spring Boot Helper是一款专为Spring Boot开发者设计的IntelliJ IDEA插件,它提供了丰富的功能来简化和加速Spring Boot应用程序的开发过程。 该插件能够智能识别Spring Boot项目结构,提供专属的代码生成、配置辅助和运…...
【USTC 计算机网络】第三章:传输层 - 面向连接的传输:TCP
本文介绍了面向连接的传输协议:TCP,首先介绍 TCP 报文段的结构以及如何设置超时定时器,接着介绍 TCP 如何实现可靠数据传输以及流量控制,最后介绍 TCP 中最重要的三次握手与四次挥手的连接建立与关闭过程。 1. TCP 概述与段结构 …...
Linux主要开发工具之gcc、gdb与make
此系列还有两篇,大家想完整掌握可以阅读另外两篇 Linux文本编辑与shell程序设计-CSDN博客 Linux基础知识详解与命令大全(超详细)-CSDN博客 1.gcc编译系统 1.1 文件名后缀 文件名后缀 文 件 类 型 文件名后缀 文 件 类 型 .c C源…...
23种设计模式-行为型模式-观察者
文章目录 简介问题解决代码关键实现说明 总结 简介 观察者是一种行为设计模式, 允许你定义一种订阅通知机制, 可在事件发生时通知多个“观察/订阅”该对象的其他对象。 问题 假如你有两种类型的对象: 顾客和商店。顾客对某个新品非常感兴趣࿰…...
去中心化预测市场
去中心化预测市场 核心概念 预测市场类型: 类别型市场:二元结果(YES/NO),例如“BTC在2024年突破10万美元?” 多选型市场:多个选项(如总统候选人),赔付基于…...
springboot-ai接入DeepSeek
1、引入pom依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency><dependencyManagement><dependencies><dependency><groupId>o…...
【C语言】数据在内存中的储存(整形)
目录 前言: 预备知识 整数在内存中的储存 原码 反码 补码 总结: 前言: 在上两章中讲解了五大内存函数,其中memchr函数,这个函数考察到数据内存的存储。 接下来为大家讲解整数在内存中的储存。 预备知识 认识…...
PCL 树木树干粗提取(地基数据,TLS)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 主要的思路如下: 1、首先,使用之前的CSF算法提取点云的地面点,在提取的过程中我们可以得到一个布料结构(地面模型)。 2、在得到这个布料结构之后,我们也就可以得到整个地面模型的高度了,之后我们只需要遍历每…...
Spring 中的 IOC
🌱 一、什么是 IOC? 📖 定义(通俗理解): IOC(Inversion of Control,控制反转) 是一种设计思想:对象不再由你自己创建和管理,而是交给 Spring 容器…...
尚硅谷2019版Java集合和泛型
第十一章 Java集合框架 集合框架全景图 mindmaproot((Java集合))Collection单列List有序可重复ArrayListLinkedListVectorSet无序唯一HashSetLinkedHashSetTreeSetMap双列HashMapLinkedHashMapTreeMapHashtablePropertiesToolsCollectionsArrays三大核心接口对比 特性ListSe…...
车载诊断架构 --- 整车重启先后顺序带来的思考
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
华为eNSP:实验 配置单区域集成ISIS
单区域集成ISIS是一种基于中间系统到中间系统(IS-IS)协议的网络架构优化方案,主要用于简化网络设计并提升数据传输效率。其核心特点包括: 单一区域部署 ISIS协议在单一逻辑区域内运行,消除多区域间的分层复杂性&am…...
常见框架漏洞(五)----中间件IIS6
一、【PUT漏洞】 漏洞描述:IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写⼊的权限,造成任意⽂件上传。 版本:IIS 6.0 1. 环境 fofa搜素环境:"IIS-6.0" 或者环境搭建:本地搭建2003…...
leetcode221.最大正方形
class Solution {public int maximalSquare(char[][] matrix) {int result 0; // 记录正方形边长int m matrix.length, n matrix[0].length;int[][] dp new int[m 1][n 1];// 动态规划for (int i 1; i < m; i) {for (int j 1; j < n; j) {if (matrix[i - 1][j - …...
C++实现AVL树
一 AVL树的概念 上上节我们学习了二叉搜索树,他的理想查找的时间复杂度是o(log n),但是如果是下面这种情况,那么它的时间复杂度就会变成o(n). 这种情况就是出现一边高的那种,它的个数和它的高度相差不大。 那么这样就会把二叉搜索…...
Linux系统安全及应用
目录 一.账号安全措施 1.1系统账号清理 1.1.1将非登录用户的shell设为无法登录 1.1.2删除无用用户 userdel 1.1.3锁定账号文件 1.1.4锁定长期不使用的账号 1.2密码安全控制 1.2.1 对新建用户 1.2.2对已有用户 1.3命令历史限制 1.3.1临时清除历史命令 1.3.2限制命令…...
JAVA反序列化深入学习(十三):Spring2
让我们回到Spring Spring2 在 Spring1 的触发链上有所变换: 替换了 spring-beans 的 ObjectFactoryDelegatingInvocationHandler使用了 spring-aop 的 JdkDynamicAopProxy ,并完成了后续触发 TemplatesImpl 的流程 简而言之,换了一个chain&am…...
迭代器运算详解(四十二)
1. 迭代器的随机访问运算 对于 vector 和 string 这样的容器,它们的迭代器支持以下随机访问运算符: 运算符说明iter n返回一个新的迭代器,该迭代器比原来的迭代器 iter 向前移动了 n 个位置(即指向后面的第 n 个元素࿰…...
Linux中Squid服务常用操作
在 Linux 中 Squid 服务常用操作介绍 1. Squid 基础操作 启动 Squid # 前台启动(调试用) squid -N -d 1# 后台启动(-s 表示将日志输出到 syslog) squid -s停止 Squid # 安全停止(需配置 pid_file) squid…...
Linux操作系统--进程的概念
目录 1.了解进程前的前景知识 冯诺依曼体系结构 操作系统(OS) 2.进程 2.1进程的概念 2.2描述进程-PCB 2.2.1task_struct 2.3查看进程 2.4通过系统调用获取进程的标识符 2.5认识fork()--创建进程 该专栏会持续更新 更新时间一周一更。下周更新内容进程状态 1.了解进程前…...
C++假期练习
思维导图 牛客练习...
HTML零基础入门笔记:狂神版
前言 本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。 【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 第1-2章:Java零基础入门笔记:(1-2)入门(简介、基础知识)-CSDN博客 第3章&…...
算法竞赛备赛——【图论】链式前向星
图论 图的存储方式: 通用的三种:邻接矩阵、邻接表、边集数组 有向图:十字链表 无向图:多重邻接表 刷题常用:邻接矩阵、链式前向星(邻接表变形) 链式前向星 算法题常用: 邻接矩阵、二维vector模…...
JAVA_类和对象
目录 1.面向对象的初步认知 1.1.什么是面向对象 1.2.面向对象与面向过程 2.类的定义和使用 2.1.简单认识类 2.2类的定义格式 2.3.练习 学生类 动物类(可爱猫猫🐱) 3.类的实例化 3.1.什么是实例化 3.2.类和对象的说明 4.this引用…...
高频面试题(含笔试高频算法整理)基本总结回顾65
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
数据库系统-数据库控制
并发控制 事务的ACID特性: 原子性(Atomicity):事务包含的所有操作要么全部成功(commit提交),要么全部失败(rollback回滚)一致性(Consistency)&a…...
Python Cookbook-5.3 根据对象的属性将对象列表排序
任务 需要根据各个对象的某个属性来完成对整个对象列表的排序。 解决方案 DSU方法仍然一如既往地有效: def sort_by_attr(sed,attr):intermed [ (getattr(x,attr),i,x) for i,x in enumerate(seg)]intermed.sort()return [ x[-1] for x in intermed def sort_by_attr_inpl…...
Java MCP SDK 开发笔记(一)
MCP 简介 AI 大模型诞生之初,其高度模拟人的对话之能力惊为天人。但我们肯定不希望止步于此—— 工具化就是我们希望 AI 能够完成的目标,由此可以从单纯的对话发展为代替繁复人力的“干活”。这条道路上毋庸置疑 AI 大模型任重道远。而 MCP(Model Contr…...
AF3 OpenFoldDataLoader类_prep_batch_properties_probs方法解读
AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类的 _prep_batch_properties_probs 方法是为每个批次数据准备 recycling 维度 的概率分布。它将根据配置文件中的设定为每个批次数据生成 recycling 轮次的概率分布,并存储到 prop_probs_tensor 中,用于后续抽样选择特定…...
寻找字符串数组中的最长共同前缀字符串
问题描述:给定一个字符串数组 strs,编写一个函数来找到这些字符串的最长公共前缀字符串,如果没有则返回空字符串"" 算法思路 横向扫描法: 从数组的第一个字符串开始,逐个和后面的字符串比较,逐…...
leetcode_数组 56. 合并区间
56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:int…...
Jenkins学习(B站教程)
文章目录 1.持续集成CI2.持续交付CD3.持续部署4.持续集成的操作流程5.jenkins简介6.后续安装部署,见视频 bilibili视频 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用…...
学习笔记—C++—类和对象(一)
目录 类和对象 类的定义 类定义格式 访问限定符 类域 实例化 实例化概念 对象的大小 this指针 C和C语言实现Stack对比 类和对象 类的定义 类定义格式 ● class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后…...
PyTorch 深度学习 || 6. Transformer | Ch6.3 Transformer 简单案例
1. 简单案例 这个代码是一个简单的 Transformer 模型的实现,这个例子展示了一个基本的序列到序列(seq2seq)任务,比如将一个数字序列转换为另一个数字序列。可以用于学习和理解 Transformer 的基本结构和工作原理。 import torch import torch.nn as nn import math# 位置…...
体育风暴篮球足球体育球员综合资讯网站模板
源码名称:篮球足球体育球员综合资讯网站模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 演示地址:https://www.52muban.com/shop/184016.html …...
Visual Studio Code SSH 连接超时对策( keep SSH alive)
文章目录 问题解决方法一:配置服务端关于ClientAliveInterval和ClientAliveCountMax1、打开终端,打开SSH配置文件:输入以下命令:2、打开配置文件后,添加以下内容:3、添加后,Esc按 <Enter>…...
Docker容器中的ubuntu apt update报错 解决办法
问题现象 # apt update Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB] Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB] Err:2 http://security.ubuntu.com/ubuntu noble-security InRelease At least one invalid signa…...
CV - 目标检测
物体检测 目标检测和图片分类的区别: 图像分类(Image Classification) 目的:图像分类的目的是识别出图像中主要物体的类别。它试图回答“图像是什么?”的问题。 输出:通常输出是一个标签或一组概率值&am…...
linux提权 corn 提权
corn提权 corn的基本使用方法 corn的作用就是可以定时的完成一下任务(如备份一下log 或者清除一下日志文件 这些就是运维人员用的) 先找一下定时任务的工作表 cat /bin/corntab 这个是普通用户 我们直接看都看不了 说明什么说明这个 是root高权限执…...
1Panel安装失败 国内docker安装失败
本文仅针对学习交流,只为了帮助计算机相关专业大学生个人技能实操而记录 非学习目的严禁学习!!!否则后果自负 1、离线安装1Panel(不需要手动安装docker,离线安装包里包括了docker) 离线包下载地…...
Excel + VBA 实现“准实时“数据的方法
Excel 本身是静态数据处理工具,但结合 VBA(Visual Basic for Applications) 可以实现 准实时数据更新,不过严格意义上的 实时数据(如毫秒级刷新)仍然受限。以下是详细分析: 1. Excel + VBA 实现“准实时”数据的方法 (1) 定时刷新(Timer 或 Application.OnTime) Appl…...
请问你怎么看待测试,指导哪些测试的类型,有用过哪些测试方法?
作为深耕测试领域多年的博主,我始终认为测试是软件质量的守护者,更是推动研发流程优化的催化剂。以下从测试认知、分类体系到实战方法论,结合具体案例为你系统拆解: 一、测试的本质认知 测试≠找 Bug,而是通过系统性验证回答三个核心问题: 软件是否符合用户需求?系统在…...
详解 Redis repl_backlog_buffer(如何判断增量同步)
一、repl_backlog_buffer 复制积压缓冲区(Replication Backlog Buffer) 是一个环形内存区域(Ring Buffer),用于临时保存主节点最近写入的写命令,以支持从节点断线重连后的增量同步。 1.1 三个复制偏移量 …...
工业操作系统国产化替代的战略路径与挑战分析
一、政策背景与战略意义 工信部提出的 2027 年替换 80 万套工业操作系统计划,是中国制造业向智能化转型的核心举措。该政策旨在通过国产化替代,解决工业领域 “缺芯少魂” 的问题,构建自主可控的工业软件生态体系。当前,中国工业操…...
JMeter接口性能测试从入门到精通
前言: 本文主要介绍了如何利用jmter进行接口的性能测试 1.在测试计划中添加线程组 1.1.线程组界面中元素含义 如果点击循环次数为永远: 2.添加HTTP取样器 2.1.填写登录接口的各个参数 2.2.在线程组下面增加查看结果树 请求成功的情况: 请求…...
WinForm真入门(9)——RichTextBox控件详解
WinForm中RichTextBox控件详解:从基础到高级应用 上一文中笔者重点介绍了TextBox控件的详细用法,忘记的 请点击WinForm真入门(8)——TextBox控件详解,那么本文中的RichTextBox与TextBox有什么区别吗,光看名字的话,多了…...
Linux : 内核中的信号捕捉
目录 一 前言 二 信号捕捉的方法 1.sigaction()编辑 2. sigaction() 使用 三 可重入函数 四 volatile 关键字 一 前言 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。在Linux: 进程信号初识-CSDN博客 这一篇中已经学习到了一种信号…...
Linux 字符串截取#与%
在Linux的Shell脚本中,#和%用于字符串截取,通过通配符模式匹配删除部分内容 批量修改文件名技巧:Linux下#、##、%、%%符号操作详解-CSDN博客 从左截取(# 和 ##) #:删除最短匹配左侧内容。 ##:…...