性能狂飙:SpringBoot应用优化实战手册
在数字时代,速度就是生命,性能就是王道!《极速启航:SpringBoot性能优化的秘籍》带你深入SpringBoot的内核,探索如何打造一个飞速响应、高效稳定的应用。从基础的代码优化到高级的数据库连接池配置,再到前端资源的压缩与缓存,我们为你揭秘每一个提升性能的秘诀。不仅如此,你还将学会如何使用强大的性能分析工具,监控你的应用就像监控自己的心跳一样。准备好了吗?让我们一起启航,让应用的性能飞跃起来!
文章目录
- 1. 引言
- 1.1 优化的重要性与目标
- 1.2 SpringBoot应用的性能挑战
- 2. 性能分析工具和指标
- 2.1 常用性能分析工具
- 2.1.1 VisualVM
- 2.1.2 JProfiler
- 2.1.3 Spring Boot Actuator
- 2.2 关键性能指标(KPIs)
- 2.2.1 响应时间
- 2.2.2 吞吐量
- 2.2.3 错误率
- 2.2.4 系统资源利用率
- 3. 代码层面的性能优化技巧
- 3.1 减少不必要的计算与查询
- 3.2 利用缓存机制
- 3.3 并发编程优化
- 3.3.1 使用线程池
- 3.3.2 并发集合的选择
- 3.4 代码优化实例
- 3.4.1 循环优化
- 3.4.2 字符串操作优化
- 4. 配置和优化数据库连接池
- 4.1 数据库连接池介绍
- 4.2 SpringBoot中常用的连接池
- 4.2.1 HikariCP
- 4.2.2 c3p0
- 4.2.3 DBCP2
- 4.3 连接池参数调优
- 4.3.1 最小连接数
- 4.3.2 最大连接数
- 4.3.3 连接超时时间
- 4.4 SQL查询优化策略
- 5. 应用层与网络优化
- 5.1 前端资源压缩与缓存
- 5.2 HTTP请求优化
- 5.2.1 使用HTTP/2
- 5.2.2 GZIP压缩
- 5.3 跨域资源共享(CORS)优化
- 6. 结论
- 6.1 总结关键优化措施
- 6.2 持续性能监控与迭代的重要性

1. 引言
1.1 优化的重要性与目标
在这个快节奏的时代,性能就像是一杯咖啡,能让人迅速提神醒脑,而优化则是那一勺糖,让咖啡变得更加可口。对于SpringBoot应用来说,性能优化就像是给这杯咖啡加上了奶泡,不仅提升了口感,还增加了层次感。优化的重要性不言而喻,它关系到应用的响应速度、稳定性和用户体验。而我们的目标,就是让这杯咖啡,哦不,是应用,变得更加丝滑、高效。
想象一下,如果你的应用像蜗牛一样慢,用户可能会在等待中失去耐心,甚至转投竞争对手的怀抱。这就像是在一场赛跑中,你的对手已经冲过终点,而你还在起跑线上系鞋带。所以,优化不仅是为了提升速度,更是为了赢得用户的青睐和市场的竞争。
1.2 SpringBoot应用的性能挑战
然而,优化之路并非一帆风顺。SpringBoot应用在性能上面临着诸多挑战,比如资源限制、代码效率、数据库访问等。这些问题就像是一块块绊脚石,阻碍着我们前进的步伐。但是,正如那句老话所说,“困难是弹簧,你弱它就强”。面对这些挑战,我们需要采取一系列策略和技巧,一一克服它们。
首先,资源限制是一个普遍存在的问题。在有限的硬件资源下,如何让应用跑得更快,就像是在一个小房间里跳舞,需要巧妙地安排每一个动作。其次,代码效率直接影响到应用的性能。优化代码,就像是给房间打扫卫生,让空间更加宽敞,让舞步更加流畅。最后,数据库访问是性能优化中的一个重要环节。优化数据库访问,就像是给房间安装了一扇大窗户,让更多的阳光照进来,让房间更加明亮。
通过这些比喻,我们可以看到,性能优化是一个全方位、多层次的过程。它需要我们从不同的角度出发,采取不同的策略,才能达到最佳效果。在接下来的章节中,我们将一步步探索SpringBoot应用的性能优化之路,就像是一位探险家,一步步揭开神秘的面纱,发现宝藏。
2. 性能分析工具和指标
2.1 常用性能分析工具
在性能优化的征程中,我们首先需要装备一些得力的助手——性能分析工具。这些工具就像是我们手中的望远镜和显微镜,帮助我们发现问题,分析问题,最终解决问题。
2.1.1 VisualVM
VisualVM 是 Java 性能分析的瑞士军刀,它提供了一个图形界面,让我们可以直观地查看 JVM 的运行情况,包括内存使用、线程状态、CPU 使用率等。使用 VisualVM,就像是在看一场精彩的球赛,我们可以清晰地看到球场上的每一个角落,每一个球员的动态。
2.1.2 JProfiler
JProfiler 是一个更为专业的性能分析工具,它提供了深入的分析功能,包括 CPU 分析、内存分析、线程分析等。使用 JProfiler,就像是在进行一次深入的体检,可以发现隐藏在身体内部的隐患。
2.1.3 Spring Boot Actuator
Spring Boot Actuator 是 Spring Boot 的一个扩展,它提供了一系列的端点,用于监控和管理 Spring Boot 应用。通过 Actuator,我们可以获取应用的运行时信息,包括健康状态、度量数据等。使用 Actuator,就像是拥有了一个智能手表,随时监控我们的身体状况。
2.2 关键性能指标(KPIs)
了解了工具之后,我们需要明确一些关键性能指标,这些指标就像是我们优化路上的里程碑,指引我们前进的方向。
2.2.1 响应时间
响应时间是衡量应用性能的一个重要指标,它反映了用户发出请求到收到响应所经历的时间。优化响应时间,就像是在赛跑中提高起跑速度,让用户更快地得到反馈。
2.2.2 吞吐量
吞吐量是指应用在单位时间内能够处理的请求数量。提高吞吐量,就像是在工厂提高生产效率,让机器运转得更快,产出更多的产品。
2.2.3 错误率
错误率是指应用在处理请求时出现错误的比率。降低错误率,就像是在考试中减少错题,提高得分率,确保应用的稳定性和可靠性。
2.2.4 系统资源利用率
系统资源利用率包括 CPU、内存、磁盘和网络等资源的使用情况。合理利用系统资源,就像是在厨房合理分配食材,让每一道菜都能发挥出最佳的味道。
通过这些性能分析工具和关键性能指标,我们可以对 SpringBoot 应用进行全面的监控和分析,找到性能瓶颈,制定优化策略。在接下来的章节中,我们将深入探讨如何利用这些工具和指标,一步步提升应用的性能。

3. 代码层面的性能优化技巧
3.1 减少不必要的计算与查询
在代码的世界里,每一次计算和查询都像是在厨房里准备食材。如果准备得太多,不仅浪费资源,还会让厨房变得拥挤不堪。因此,减少不必要的计算和查询,就像是精简菜单,只准备那些真正需要的食材。
举个例子,假设我们有一个方法,需要根据用户ID查询用户信息,如果这个方法在循环中被多次调用,而用户ID并没有变化,那么我们可以将其移出循环,只查询一次,然后复用结果。
// 假设getUserById是一个查询数据库的方法
String userId = "12345";
User user = getUserById(userId); // 只查询一次for (int i = 0; i < 10; i++) {// 循环中使用user变量,而不再重复查询processUser(user);
}
3.2 利用缓存机制
缓存就像是我们的大脑,能够快速回忆起之前学习过的知识,而不需要每次都从头开始学习。在应用中使用缓存,可以显著提高数据的读取速度,减少对数据库的访问。
想象一下,如果你每次打开网页都需要重新下载所有的图片和脚本,那会是多么痛苦的体验。但是,有了浏览器缓存,这些资源就可以被快速加载,提升用户的访问速度。
在SpringBoot中,我们可以使用各种缓存注解,如@Cacheable和@CacheEvict,来轻松实现缓存逻辑。
@Cacheable(value = "userCache", key = "#id")
public User findUserById(String id) {// 这里会执行数据库查询,并将结果缓存起来return userRepository.findById(id);
}
3.3 并发编程优化
并发编程就像是在厨房里同时进行多个烹饪任务,需要精心安排,以避免混乱和资源冲突。
3.3.1 使用线程池
线程池就像是厨房里的厨师团队,通过合理分配任务,可以提高工作效率,避免资源浪费。在SpringBoot中,我们可以通过配置ThreadPoolTaskExecutor来创建和管理线程池。
@Configuration
public class ThreadPoolConfig {@Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(4);executor.setQueueCapacity(100);executor.setThreadNamePrefix("TaskExecutor-");executor.initialize();return executor;}
}
3.3.2 并发集合的选择
并发集合就像是厨房里的高效工具,可以帮助我们快速完成烹饪任务。Java提供了多种并发集合,如ConcurrentHashMap,CopyOnWriteArrayList等,它们在多线程环境下表现更优。
ConcurrentHashMap<String, User> userMap = new ConcurrentHashMap<>();
userMap.put("12345", newUser); // 线程安全的插入操作
3.4 代码优化实例
3.4.1 循环优化
循环优化就像是在厨房里优化烹饪流程,让每一道工序都更加高效。例如,我们可以减少循环中的复杂操作,或者使用更高效的循环结构。
// 避免在循环中进行复杂的操作
List<User> users = userRepository.findAll();
for (User user : users) {processUser(user); // 假设这是一个简单操作
}
3.4.2 字符串操作优化
字符串操作就像是在厨房里处理食材,需要小心翼翼,以避免浪费。在Java中,字符串是不可变的,这意味着每次修改字符串都会创建一个新的字符串对象。因此,我们应该避免在循环中进行大量的字符串拼接。
// 避免在循环中进行字符串拼接
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 100; i++) {builder.append(i); // 使用StringBuilder来优化性能
}
String result = builder.toString();
通过这些代码层面的优化技巧,我们的SpringBoot应用就能像厨房里的高效烹饪流程一样,快速、高效地处理任务。在下一章,我们将探讨如何配置和优化数据库连接池,让数据访问更加顺畅。
4. 配置和优化数据库连接池
4.1 数据库连接池介绍
数据库连接池就像是我们的“水桶”,它帮我们预先准备好了“水”(数据库连接),这样我们每次需要用“水”时,就可以直接从“水桶”里取,而不需要每次都去“井”(数据库)里打水。这大大节省了我们的时间,也提高了效率。
4.2 SpringBoot中常用的连接池
SpringBoot中,有几个常用的“水桶”,也就是连接池的实现,它们各有特点,适合不同的场景。
4.2.1 HikariCP
HikariCP 是目前最快的连接池,它就像是一辆高速跑车,启动快、运行快、反应快。它还提供了极佳的并发性能和良好的监控支持。
# application.properties
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=15
spring.datasource.hikari.idleTimeout=30000
spring.datasource.hikari.poolName=HikariPool
4.2.2 c3p0
c3p0 是一个成熟的连接池实现,它就像是一辆经典的老爷车,虽然速度可能不如跑车快,但是稳定可靠,经得起时间的考验。
# application.properties
spring.datasource.c3p0.minPoolSize=5
spring.datasource.c3p0.maxPoolSize=15
spring.datasource.c3p0.timeout=30000
spring.datasource.c3p0.idleConnectionTestPeriod=30
4.2.3 DBCP2
DBCP2 是 Apache 的一个项目,它就像是一辆经济型轿车,性价比高,适合预算有限的情况。
# application.properties
spring.datasource.dbcp2.minEvictableIdleTimeMillis=30000
spring.datasource.dbcp2.maxTotal=15
spring.datasource.dbcp2.numTestsPerEvictionRun=10
4.3 连接池参数调优
连接池的参数调优就像是调整“水桶”的大小和“水”的流动速度,以适应不同的需求。
4.3.1 最小连接数
最小连接数决定了“水桶”里始终保持的“水”量,太少了可能不够用,太多了又会造成浪费。
4.3.2 最大连接数
最大连接数则是“水桶”能装的“水”的最大量,超过这个量,就需要等待或者拒绝服务了。
4.3.3 连接超时时间
连接超时时间则是规定了“水”在“水桶”里可以存放的最长时间,时间太长“水”可能会变质,太短则可能导致频繁地更换“水”。
4.4 SQL查询优化策略
SQL查询优化就像是挑选“水桶”里的“水”,我们要挑选最新鲜、最清澈的“水”,避免取到杂质或者浑水。
- 使用索引:给数据库表加上索引,就像是给“水桶”装上过滤器,可以快速找到我们需要的“水”。
- 避免全表扫描:尽量减少全表扫描,就像是避免把“水桶”里的“水”全部倒出来再找我们需要的“水”。
- 优化查询语句:优化查询语句,就像是优化取“水”的流程,让取“水”更加高效。
-- 一个简单的SQL查询优化示例
SELECT * FROM users WHERE active = true AND last_login > '2024-01-01';
-- 可以改为
SELECT * FROM users WHERE active = true AND last_login > '2024-01-01' LIMIT 100;
-- 限制结果集大小,提高查询效率
通过这些策略,我们的数据库连接池就能像一个高效的“水桶”一样,为我们的应用提供稳定、快速的数据访问服务。下一章,我们将探讨应用层与网络优化,让应用的运行更加顺畅,用户体验更加舒适。

5. 应用层与网络优化
5.1 前端资源压缩与缓存
前端资源的压缩与缓存就像是给网站穿上了一件保暖的大衣,不仅让网站在寒冷的网络世界中保持温暖,还能让访问者感受到快速和便捷。
- 资源压缩:通过压缩CSS、JavaScript文件和图片,我们可以减少文件的大小,加快加载速度。这就像是把一件厚重的大衣换成一件轻薄的羽绒服,既保暖又轻便。
<!-- 在HTML中引用压缩后的CSS和JavaScript文件 -->
<link rel="stylesheet" href="styles.min.css">
<script src="scripts.min.js"></script>
- 资源缓存:利用浏览器缓存可以减少重复加载资源的次数。这就像是给大衣加上了一个智能温控系统,只在需要的时候提供温暖。
<!-- HTTP缓存相关的头部示例 -->
<META HTTP-EQUIV="Cache-Control" CONTENT="max-age=86400">
5.2 HTTP请求优化
HTTP请求的优化就像是给网站配备了一辆高速列车,让数据传输更加迅速。
5.2.1 使用HTTP/2
HTTP/2 是HTTP协议的一个升级版本,它提供了更高效的数据传输机制。使用HTTP/2,就像是给网站换上了一辆高速列车,让数据传输更加迅速。
# 在SpringBoot应用的配置文件中启用HTTP/2
server:http2:enabled: true
5.2.2 GZIP压缩
GZIP压缩可以进一步减少传输的数据量。这就像是给高速列车的车厢加上了压缩装置,让车厢能够装载更多的货物,同时还能保持高速运行。
# application.properties
server.compression.enabled=true
server.compression.mime-types=text/html,text/xml,text/plain,text/css,application/javascript,application/json
5.3 跨域资源共享(CORS)优化
跨域资源共享(CORS)优化就像是给网站打开了一扇大门,让来自不同地方的访客都能够进入。
- CORS策略配置:合理配置CORS策略,允许特定的域名访问我们的资源。这就像是在大门上安装了一个智能门禁系统,只有得到授权的人才能进入。
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("http://example.com");}
}
通过这些应用层与网络优化措施,我们的网站就像是穿上了一件保暖的大衣,配备了一辆高速列车,并且打开了一扇大门,让访问者能够快速、便捷、安全地访问我们的资源。在下一章,我们将总结关键的优化措施,并强调持续性能监控与迭代的重要性。
6. 结论
6.1 总结关键优化措施
经过了前面章节的探索,我们就像是完成了一场精彩的寻宝之旅,找到了优化SpringBoot应用的宝藏。现在,让我们来回顾一下这场旅程中发现的关键优化措施。
- 性能分析工具:我们学会了使用VisualVM、JProfiler和Spring Boot Actuator这些工具来监控和分析应用的性能。
- 代码层面优化:我们学会了减少不必要的计算和查询,利用缓存机制,优化并发编程,以及对循环和字符串操作进行优化。
- 数据库连接池优化:我们了解了如何配置和优化HikariCP、c3p0和DBCP2等连接池,以及如何调整连接池参数。
- 应用层与网络优化:我们学会了对前端资源进行压缩和缓存,使用HTTP/2和GZIP压缩来优化HTTP请求,以及配置CORS策略。
这些优化措施就像是我们寻宝过程中收集到的宝贝,每一件都有其独特的价值和作用。
6.2 持续性能监控与迭代的重要性
然而,寻宝之旅并没有结束。性能优化是一个持续的过程,就像是种下一棵树,需要我们不断地浇水、施肥,它才能茁壮成长。
- 持续监控:我们需要持续监控应用的性能,以便及时发现问题并进行优化。这就像是给树定期检查,确保它的健康成长。
- 性能迭代:随着业务的发展和用户需求的变化,我们需要不断地迭代和优化应用的性能。这就像是根据季节的变化调整浇水和施肥的策略。
// 一个简单的健康检查端点示例
@GetMapping("/actuator/health")
public Map<String, Object> healthCheck() {// 实现健康检查逻辑
}
通过持续的性能监控和迭代,我们的SpringBoot应用就能保持最佳状态,为用户提供最佳的服务。这就像是一棵茁壮成长的树,不仅能为我们提供阴凉,还能结出丰硕的果实。
最后,让我们记住,性能优化是一场永无止境的旅程。我们需要不断地学习、探索和实践,才能在这个快速变化的技术世界中保持领先。所以,拿起你的工具,继续前进吧,更多的宝藏还在等待着我们去发现!
通过这一系列的优化措施,我们的SpringBoot应用将能够以更高的效率和更好的性能服务于用户,就像一杯精心调制的咖啡,让人回味无穷。记住,优化是一场旅程,而不是终点。让我们一起享受这场旅程,不断探索,不断进步!
相关文章:
性能狂飙:SpringBoot应用优化实战手册
在数字时代,速度就是生命,性能就是王道!《极速启航:SpringBoot性能优化的秘籍》带你深入SpringBoot的内核,探索如何打造一个飞速响应、高效稳定的应用。从基础的代码优化到高级的数据库连接池配置,再到前端…...
Github上一款开源、简洁、强大的任务管理工具:Condution
Condution 是一款开源任务管理工具,它以简洁易用、功能强大著称。它旨在为用户提供一个简单高效的平台,帮助他们管理日常任务、提高工作效率。 1. Condution 的诞生背景 现如今,市面上存在着许多任务管理软件,但它们往往价格昂贵…...
LeetCode-2938. 区分黑球与白球【贪心 双指针 字符串】
LeetCode-2938. 区分黑球与白球【贪心 双指针 字符串】 题目描述:解题思路一:贪心解题思路二:一次遍历统计1的个数,找0后累加左边的1的个数解题思路三: 题目描述: 桌子上有 n 个球,每个球的颜色…...
深度神经网络——什么是扩散模型?
1. 概述 在人工智能的浩瀚领域中,扩散模型正成为技术创新的先锋,它们彻底改变了我们处理复杂问题的方式,特别是在生成式人工智能方面。这些模型基于高斯过程、方差分析、微分方程和序列生成等坚实的数学理论构建。 业界巨头如Nvidia、Google…...
有代码冗余的检查工具嘛
是的,有一些代码质量工具可以帮助检查冗余代码。这些工具可以分析代码库,并识别出重复、冗余或不必要的代码片段。一些流行的代码质量工具包括: PMD: PMD 是一个开源的静态代码分析工具,支持多种编程语言,包括 Java、…...
3D培训大师:快速输出标准3D课件,打造沉浸式培训体验
随着技术的日新月异和市场的迅猛扩张,企业对员工专业技能培训的需求日益凸显。传统的培训方式往往依赖于实地操作、现场指导,这不仅需要大量的人力、物力和时间成本,而且存在安全风险。特别是化工、机械制造等行业,实操培训的成本…...
Python接口自动化测试:Json 数据处理实战
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 上一篇说了关于json数据处理,是为了断言方便,这篇就带各位小伙伴实战一下…...
Java概述 , Java环境安装 , 第一个Hello World
环境变量,HelloWorld 1.会常用的dos命令 2.会安装java所需要的环境(jdk) 3.会配置java的环境变量 4.知道java开发三步骤 5.会java的入门程序(HelloWorld) 6.会三种注释方式 7.知道Java入门程序所需要注意的地方 8.知道println和print的区别第一章 Java概述 1.1 JavaSE体系介绍…...
查看Linux端口占用和开启端口命令
查看端口的使用的情况 lsof 命令 比如查看80端口的使用的情况 lsof -i tcp:80列出所有的端口 netstat -ntlp查看端口的状态 /etc/init.d/iptables status开启端口以开启端口80为例。 1 用命令开启端口 iptables -I INPUT -p tcp --dport 80 -j accpet --写入要开放的端口/…...
24-unittest简介
一、unittest简介 unittest是Python中常用的单元测试框架,与Java中的Junit单元测试框架类似。 二、示例程序 1)导入unittest模块 import unittest 2)使用help()函数查看源码中的示例程序 help(unittest) Simple usage:import unittestc…...
Kotlin 中,扩展函数(Extension Functions)
在 Kotlin 中,扩展函数(Extension Functions)是用于向已有的类添加新功能而无需继承或使用装饰模式的一个特性。这允许你通过更自然的语法为现有类型添加方法。 下面是一个简单的扩展函数示例: // 定义一个扩展函数,…...
堪称2024最强的前端面试场景题,让419人成功拿到offer
前言 2024年的秋季招聘还有两个月就即将到来,很多同学开始思考前端面试中场景题的重要性。这里我提供一些见解和建议来帮助大家准备即将到来的面试。 首先,理解面试中场景题的必要性是至关重要的。与算法或理论问题不同,场景题更贴近实际工…...
使用node将页面转为pdf?(puppeteer实现)
本文章适合win系统下实验(linux,mac可能会出现些莫名其妙的bug我也不会解决) 具体过程 首先了解什么时无头浏览器启动无头浏览器打开指定的url页面设置导出pdf格式开始转化完整基础代码 首先了解什么时无头浏览器 没有界面的浏览器下载pupp…...
龙迅#LT8711H支持TYPE-C/DP/EDP转HDMI功能应用,分辨率支持 1080p@60Hz,芯片内置固件!
1. 概述 LT8711H是一款高性能 Type-C/DP1.2/EDP 转 HD-DVI1.3 转换器,设计用于将 USB Type-C 源或 DP1.2 源连接到 HD-DVI1.3 接收器。 该LT8711H集成了符合 DP1.2 标准的接收器和符合 HD-DVI1.3 标准的发射器。此外,还包括两个用于 CC 通信的 CC 控制器…...
WPF中Ignorable
在WPF中,“Ignorable”这个概念主要与XAML解析和标记扩展有关。当WPF的XAML解析器遇到一个它不认识的元素或属性时,它会抛出一个异常,这是因为默认情况下,WPF要求所有XAML都是完全可识别和可解析的。然而,在某些情况下…...
系统安全及应用11
一个新的服务器到手之后,部署服务器的初始化 1、配置IP地址 网关 dns解析(static)内网和外网 2、安装源外网(在线即可),内网(只能用源码包编译安装) 3、磁盘分区,lvm …...
vue中SKU实现
通过发送请求获取商品详情数据,包括商品规格(specs)和库存信息(skus)。 选中状态更新:根据当前状态进行激活或取消激活的逻辑,通过为每个规格项添加的“selected”字段来标识是否激活,同时利用样式处理,通过动态类属性…...
闭眼推荐的,新手教师工具
亲爱的老师们,尤其是那些刚踏入教育界的新手教师们,还在为如何高效管理课堂、如何制作精美的教学材料而头疼吗?让我来分享几款教育界口碑爆棚的工具。 易查分小程序 易查分是一款超级方便的成绩查询工具,一分钟就能上传成绩并生成…...
charles抓包工具之---添加vConsole
Charles Rewrite重写(详解!必懂系列)-CSDN博客 chales 重写/断点/映射/手机代理/其他主机代理_charles 批量映射-CSDN博客 在 Charles 上添加 rewrite 规则,以便在响应的 <head> 部分添加 vConsole,可以按照以下步骤操作:…...
Java多线程-初阶1
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1. 认识线程(Thread) 1.线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
