Hibernate 性能优化:告别慢查询,提升数据库访问性能
Hibernate 性能优化:告别慢查询,提升数据库访问性能
Hibernate 作为一款流行的 ORM 框架,极大地简化了 Java 应用程序与数据库之间的交互,但如果不进行合理优化,性能瓶颈在高并发场景下就会暴露无遗。本文将深入探讨 Hibernate 的性能优化策略,通过详细代码示例,帮助读者掌握如何提升数据库访问性能,告别慢查询的困扰。
一、理解 Hibernate 的缓存机制
Hibernate 的缓存机制是性能优化的关键点之一,它主要分为一级缓存和二级缓存。
(一)一级缓存
一级缓存是 Hibernate 会话(Session
)级别的缓存。在同一个 Session
中,对同一实体对象的多次查询会直接从缓存中获取,而不会重复向数据库发起查询,从而减少数据库访问次数,提高性能。
示例代码
Session session = sessionFactory.openSession();
try {// 查询一次User user1 = session.get(User.class, 1);System.out.println(user1.getUsername());// 同一会话中再次查询相同用户User user2 = session.get(User.class, 1);System.out.println(user2.getUsername());// 验证两次查询是否相同实例System.out.println(user1 == user2); // 输出 true
} finally {session.close();
}
在上述代码中,user1
和 user2
是同一个实例,第二次查询并未再次访问数据库。
(二)二级缓存
二级缓存是跨多个 Session
的缓存,它存储在 Hibernate 的 SessionFactory
级别。通过配置二级缓存,可以显著减少重复的数据库查询,实现数据的复用。
配置二级缓存
要使用二级缓存,需要配置第三方缓存提供商,如 EhCache、Redis 等。以下是使用 EhCache 的配置示例。
-
添加依赖
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-ehcache</artifactId><version>5.4.32.Final</version> </dependency>
-
在 Hibernate 配置文件(
hibernate.cfg.xml
)中添加缓存相关配置<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> <property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>
-
创建 EhCache 配置文件(
ehcache.xml
)<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="ehcache.xsd"><diskStore path="java.io.tmpdir"/><defaultCache maxElementsInMemory="10000" eternal="false"timeToIdleSeconds="120" timeToLiveSeconds="120"overflowToDisk="false"/><cache name="com.example.User" maxElementsInMemory="500" eternal="false"timeToIdleSeconds="300" timeToLiveSeconds="600"overflowToDisk="false"/> </ehcache>
-
在实体类上启用缓存
@Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String username;private String email;// 省略 getter 和 setter 方法 }
通过以上配置,当在不同 Session
中查询 User
实体时,Hibernate 会优先从二级缓存中获取数据,减少对数据库的直接访问。
二、优化 Hibernate 的查询语句
查询语句的优化是提升性能的另一个重要方面。Hibernate 提供了 HQL(Hibernate Query Language)和 Criteria API 等查询方式,但不当的使用可能导致性能问题。
(一)使用 HQL 查询优化
HQL 是 Hibernate 的查询语言,它类似于 SQL,但操作的是实体类而不是数据库表。在使用 HQL 时,应避免复杂的查询,尽量减少关联查询的深度。
示例代码
假设有一个 User
实体和一个 Order
实体,User
和 Order
是一对多的关系。
错误示例(深度关联查询):
String hql = "from User u join fetch u.orders o where u.id = :userId";
Query query = session.createQuery(hql);
query.setParameter("userId", 1);
List<User> users = query.getResultList();
如果 Order
实体中还关联了其他实体,这种深度关联查询会生成非常复杂的 SQL,导致性能下降。
优化后的代码:
String hql = "from User u where u.id = :userId";
Query query = session.createQuery(hql);
query.setParameter("userId", 1);
User user = (User) query.getSingleResult();// 在需要时再加载订单
String orderHql = "from Order o where o.user.id = :userId";
Query orderQuery = session.createQuery(orderHql);
orderQuery.setParameter("userId", user.getId());
List<Order> orders = orderQuery.getResultList();
通过将关联查询拆分为两个简单的查询,避免了复杂的 SQL 生成,从而提高了查询性能。
(二)使用 Criteria API 查询优化
Criteria API 是 Hibernate 提供的另一种查询方式,它允许通过类型安全的方式构建查询。虽然 Criteria API 在编写时更加安全,但如果使用不当,也会导致性能问题。
示例代码
错误示例(动态关联查询):
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> userRoot = query.from(User.class);
userRoot.fetch("orders", JoinType.LEFT);
query.select(userRoot).where(cb.equal(userRoot.get("id"), 1));
List<User> users = session.createQuery(query).getResultList();
与 HQL 的深度关联查询类似,这种动态关联查询也会生成复杂的 SQL。
优化后的代码:
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> userRoot = query.from(User.class);
query.select(userRoot).where(cb.equal(userRoot.get("id"), 1));
List<User> users = session.createQuery(query).getResultList();// 在需要时再加载订单
CriteriaQuery<Order> orderQuery = cb.createQuery(Order.class);
Root<Order> orderRoot = orderQuery.from(Order.class);
orderQuery.select(orderRoot).where(cb.equal(orderRoot.get("user").get("id"), 1));
List<Order> orders = session.createQuery(orderQuery).getResultList();
同样通过分步查询,避免了复杂的关联查询,提升了性能。
三、批量操作优化
在处理大量数据时,批量操作可以显著减少数据库的交互次数,从而提升性能。
(一)批量插入数据
在批量插入数据时,应使用 session.save()
替代 session.persist()
,并定期刷新 Session
和清理缓存。
示例代码
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for (int i = 0; i < 1000; i++) {User user = new User();user.setUsername("username" + i);user.setEmail("email" + i + "@example.com");session.save(user);if (i % 20 == 0) { // 每 20 条记录执行一次刷新和清理session.flush();session.clear();}
}
tx.commit();
session.close();
通过定期调用 flush()
和 clear()
,可以避免缓存过大导致的内存问题,同时减少数据库的交互次数。
(二)批量更新数据
对于批量更新操作,可以通过 HQL 提供的批量更新功能来实现。
示例代码
String hql = "update User u set u.username = :newUsername where u.username = :oldUsername";
int updatedEntities = session.createQuery(hql).setParameter("newUsername", "newUsername").setParameter("oldUsername", "oldUsername").executeUpdate();
这种方式会直接生成一条 SQL 更新语句,避免了逐条更新导致的大量数据库交互,从而提高了性能。
四、其他优化建议
除了上述优化策略外,还有一些其他建议可以帮助提升 Hibernate 的性能。
(一)合理配置数据库连接池
数据库连接池可以有效管理数据库连接,减少连接的创建和销毁次数。Hibernate 可以与多种连接池工具(如 DBCP、C3P0、HikariCP 等)集成。
示例代码(使用 HikariCP)
-
添加依赖
<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version> </dependency>
-
**在 Hibernate 配置文件
继续为你完善博客内容:
Hibernate 性能优化:告别慢查询,提升数据库访问性能
Hibernate 作为一款流行的 ORM 框架,极大地简化了 Java 应用程序与数据库之间的交互,但如果不进行合理优化,性能瓶颈在高并发场景下就会暴露无遗。本文将深入探讨 Hibernate 的性能优化策略,通过详细代码示例,帮助读者掌握如何提升数据库访问性能,告别慢查询的困扰。
一、理解 Hibernate 的缓存机制
Hibernate 的缓存机制是性能优化的关键点之一,它主要分为一级缓存和二级缓存。
(一)一级缓存
一级缓存是 Hibernate 会话(Session
)级别的缓存。在同一个 Session
中,对同一实体对象的多次查询会直接从缓存中获取,而不会重复向数据库发起查询,从而减少数据库访问次数,提高性能。
示例代码
Session session = sessionFactory.openSession();
try {// 查询一次User user1 = session.get(User.class, 1);System.out.println(user1.getUsername());// 同一会话中再次查询相同用户User user2 = session.get(User.class, 1);System.out.println(user2.getUsername());// 验证两次查询是否相同实例System.out.println(user1 == user2); // 输出 true
} finally {session.close();
}
在上述代码中,user1
和 user2
是同一个实例,第二次查询并未再次访问数据库。
(二)二级缓存
二级缓存是跨多个 Session
的缓存,它存储在 Hibernate 的 SessionFactory
级别。通过配置二级缓存,可以显著减少重复的数据库查询,实现数据的复用。
配置二级缓存
要使用二级缓存,需要配置第三方缓存提供商,如 EhCache、Redis 等。以下是使用 EhCache 的配置示例。
-
添加依赖
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-ehcache</artifactId><version>5.4.32.Final</version> </dependency>
-
在 Hibernate 配置文件(
hibernate.cfg.xml
)中添加缓存相关配置<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> <property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>
-
创建 EhCache 配置文件(
ehcache.xml
)<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="ehcache.xsd"><diskStore path="java.io.tmpdir"/><defaultCache maxElementsInMemory="10000" eternal="false"timeToIdleSeconds="120" timeToLiveSeconds="120"overflowToDisk="false"/><cache name="com.example.User" maxElementsInMemory="500" eternal="false"timeToIdleSeconds="300" timeToLiveSeconds="600"overflowToDisk="false"/> </ehcache>
-
在实体类上启用缓存
@Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String username;private String email;// 省略 getter 和 setter 方法 }
通过以上配置,当在不同 Session
中查询 User
实体时,Hibernate 会优先从二级缓存中获取数据,减少对数据库的直接访问。
二、优化 Hibernate 的查询语句
查询语句的优化是提升性能的另一个重要方面。Hibernate 提供了 HQL(Hibernate Query Language)和 Criteria API 等查询方式,但不当的使用可能导致性能问题。
(一)使用 HQL 查询优化
HQL 是 Hibernate 的查询语言,它类似于 SQL,但操作的是实体类而不是数据库表。在使用 HQL 时,应避免复杂的查询,尽量减少关联查询的深度。
示例代码
假设有一个 User
实体和一个 Order
实体,User
和 Order
是一对多的关系。
错误示例(深度关联查询):
String hql = "from User u join fetch u.orders o where u.id = :userId";
Query query = session.createQuery(hql);
query.setParameter("userId", 1);
List<User> users = query.getResultList();
如果 Order
实体中还关联了其他实体,这种深度关联查询会生成非常复杂的 SQL,导致性能下降。
优化后的代码:
String hql = "from User u where u.id = :userId";
Query query = session.createQuery(hql);
query.setParameter("userId", 1);
User user = (User) query.getSingleResult();// 在需要时再加载订单
String orderHql = "from Order o where o.user.id = :userId";
Query orderQuery = session.createQuery(orderHql);
orderQuery.setParameter("userId", user.getId());
List<Order> orders = orderQuery.getResultList();
通过将关联查询拆分为两个简单的查询,避免了复杂的 SQL 生成,从而提高了查询性能。
(二)使用 Criteria API 查询优化
Criteria API 是 Hibernate 提供的另一种查询方式,它允许通过类型安全的方式构建查询。虽然 Criteria API 在编写时更加安全,但如果使用不当,也会导致性能问题。
示例代码
错误示例(动态关联查询):
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> userRoot = query.from(User.class);
userRoot.fetch("orders", JoinType.LEFT);
query.select(userRoot).where(cb.equal(userRoot.get("id"), 1));
List<User> users = session.createQuery(query).getResultList();
与 HQL 的深度关联查询类似,这种动态关联查询也会生成复杂的 SQL。
优化后的代码:
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> userRoot = query.from(User.class);
query.select(userRoot).where(cb.equal(userRoot.get("id"), 1));
List<User> users = session.createQuery(query).getResultList();// 在需要时再加载订单
CriteriaQuery<Order> orderQuery = cb.createQuery(Order.class);
Root<Order> orderRoot = orderQuery.from(Order.class);
orderQuery.select(orderRoot).where(cb.equal(orderRoot.get("user").get("id"), 1));
List<Order> orders = session.createQuery(orderQuery).getResultList();
同样通过分步查询,避免了复杂的关联查询,提升了性能。
三、批量操作优化
在处理大量数据时,批量操作可以显著减少数据库的交互次数,从而提升性能。
(一)批量插入数据
在批量插入数据时,应使用 session.save()
替代 session.persist()
,并定期刷新 Session
和清理缓存。
示例代码
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for (int i = 0; i < 1000; i++) {User user = new User();user.setUsername("username" + i);user.setEmail("email" + i + "@example.com");session.save(user);if (i % 20 == 0) { // 每 20 条记录执行一次刷新和清理session.flush();session.clear();}
}
tx.commit();
session.close();
通过定期调用 flush()
和 clear()
,可以避免缓存过大导致的内存问题,同时减少数据库的交互次数。
(二)批量更新数据
对于批量更新操作,可以通过 HQL 提供的批量更新功能来实现。
示例代码
String hql = "update User u set u.username = :newUsername where u.username = :oldUsername";
int updatedEntities = session.createQuery(hql).setParameter("newUsername", "newUsername").setParameter("oldUsername", "oldUsername").executeUpdate();
这种方式会直接生成一条 SQL 更新语句,避免了逐条更新导致的大量数据库交互,从而提高了性能。
四、其他优化建议
除了上述优化策略外,还有一些其他建议可以帮助提升 Hibernate 的性能。
(一)合理配置数据库连接池
数据库连接池可以有效管理数据库连接,减少连接的创建和销毁次数。Hibernate 可以与多种连接池工具(如 DBCP、C3P0、HikariCP 等)集成。
示例代码(使用 HikariCP)
-
添加依赖
<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>4.0.3</version> </dependency>
-
在 Hibernate 配置文件(
hibernate.cfg.xml
)中配置连接池<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.acquire_increment">2</property> <property name="hibernate.c3p0.idle_test_period">300</property> <property name="hibernate.c3p0.timeout">1800</property>
(二)避免过度使用动态查询
动态查询虽然灵活,但会增加 SQL 生成的复杂度,导致性能下降。尽量使用预定义的查询或存储过程。
(三)优化实体类映射
合理设计实体类与数据库表的映射关系,避免不必要的字段和关联映射。对于不常用的字段,可以使用 @Lazy
注解延迟加载。
(四)监控 Hibernate 性能
使用工具(如 Hibernate Statistics、JProfiler 等)监控 Hibernate 的性能指标,如查询次数、缓存命中率等,及时发现性能瓶颈。
示例代码(启用 Hibernate Statistics)
Configuration configuration = new Configuration();
configuration.setProperty("hibernate.generate_statistics", "true");
SessionFactory sessionFactory = configuration.buildSessionFactory();// 获取性能统计信息
SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) sessionFactory;
Statistics statistics = sessionFactoryImplementor.getStatistics();
statistics.setStatisticsEnabled(true);// 打印统计信息
System.out.println("查询次数: " + statistics.getEntityLoadCount());
System.out.println("缓存命中率: " + statistics.getSecondLevelCacheHitCount());
五、总结
通过合理利用 Hibernate 的缓存机制、优化查询语句、批量操作以及配置其他参数,可以显著提升数据库访问性能,避免慢查询问题。在实际开发中,应根据具体场景选择合适的优化策略,并结合性能监控工具不断调整和优化。只有深入理解 Hibernate 的工作机制,才能充分发挥其性能优势,构建高效稳定的 Java 应用程序。
相关文章:
Hibernate 性能优化:告别慢查询,提升数据库访问性能
Hibernate 性能优化:告别慢查询,提升数据库访问性能 Hibernate 作为一款流行的 ORM 框架,极大地简化了 Java 应用程序与数据库之间的交互,但如果不进行合理优化,性能瓶颈在高并发场景下就会暴露无遗。本文将深入探讨 …...
【JavaWeb+后端常用部件】
回顾内容看: 一、获取请求参数的方法 参考:[JavaWeb]——获取请求参数的方式(全面!!!)_java 获取请求参数-CSDN博客 Json格式的Body加备注RequestBody{id}动态路径加备注PathVariableid?&name?直接接收就好 i…...
Playwright 简介
Playwright 简介 说明:本教程基于 @playwright/test@1.51.1 版本编写,内容和目录结构与该版本官方推荐保持一致。 适合人群与学习路径 适合谁? 想入门自动化测试的测试工程师需要跨浏览器、移动端自动化的开发者希望提升测试效率、减少维护成本的团队学习建议 跟着文档动手实…...
# 2-STM32-复位和时钟控制RCC
STM32-复位和时钟控制RCC 2-STM32-复位和时钟控制RCC摘要说明本文参考资料如下: 一、STM32最小系统回顾STM32F103C8T6核心板原理图 二、复位三、时钟3.1 时钟树3.2 STM32启动过程3.2 SystemInit()函数3.2.1 SystemInit()第1句:3.2.2 SystemInit()第2句&a…...
idea中的vcs不见了,如何解决
按如下顺序依次找 filesettingsversion controldirectory mappings点击号vcs 改为Subversion 省流:看如下图...
元数据分类
元数据(Metadata)是描述数据的数据,通常分为 业务元数据、技术元数据 和 操作元数据。这三类元数据从不同维度对数据进行描述和管理,以下是它们的定义、作用和示例: 1. 业务元数据(Business Metadata&#…...
【C语言】(9)—指针3
文章目录 一、字符指针的深入理解二、数组指针详解三、二维数组传参的本质四、函数指针及其应用五、函数指针数组与转移表 一、字符指针的深入理解 1.1 字符指针的基本使用 字符指针(char*)是指向字符类型数据的指针,它有两种常见的使用方式: // 方式一…...
拍电影为什么常用绿幕?认识色度键控(Chroma Key)技术
许多电影拍摄使用绿幕技术,其核心原因在于它通过色度键控(Chroma Key)技术实现背景替换,从而为创作提供高度灵活性、成本效益和视觉效果的可控性。以下从技术原理、应用场景、优势及与其他技术的对比等方面展开分析: 一、绿幕技术的基本原理 绿幕技术的核心是色度键控(C…...
【iOS】Tagged Pointer
【iOS】Tagged Pointer 文章目录 【iOS】Tagged Pointer前言认识Tagged Pointer使用案例结构isa指针经典面试题 前言 在之前的学习中笔者在字符串章节简单了解过这个Tagged Pointer后面笔者就没在多了解这部分内容,今天决定比较系统的学习一下有关于这部分内容的知识. 认识Tagg…...
17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--loki
在微服务中,日志是非常重要的组成部分。它不仅可以帮助我们排查问题,还可以帮助我们分析系统的性能和使用情况。 一、loki简介 loki是一个开源的日志聚合系统,它可以帮助我们高效地收集、存储和分析日志数据。loki的设计理念是“简单、快速…...
OpenWrt开发第8篇:树莓派开发板做无线接入点
文/指尖动听知识库-谷谷 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:Openwrt开发-基于Raspberry Pi 4B开发板 树莓派开发板作为无线接入点的时候,可以通过电脑和手机打开WiFi功能搜索到相应打开的WiFi; 1 通过Web操作界面开启wifi 1...
电源架构与太阳能充电器电路设计分析
一、电源架构基本工作原理分析 #mermaid-svg-mEaBEAY5xdCMN9Uy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mEaBEAY5xdCMN9Uy .error-icon{fill:#552222;}#mermaid-svg-mEaBEAY5xdCMN9Uy .error-text{fill:#5522…...
英语句型结构
句型类型结构示例示例解释应用场合简单句主谓(SV)The bird flies.“The bird” 是主语,“flies” 是不及物动词作谓语,描述鸟 “飞” 的动作。描述事物基本行为,如动物习性、自然现象等。主谓宾(SVO&#x…...
什么是卷积神经网络
卷积神经网络(CNN)的全面解析 卷积神经网络(Convolutional Neural Network, CNN)是深度学习领域最成功的模型之一,尤其在图像处理和模式识别任务中表现卓越。以下从基本结构、核心组件、发展历程、应用场景、数学基础、训练方法及优缺点等方面展开详述。 一、基本定义与核…...
操作系统: 第三章节 :中断和处理机调度
一:中断与中断系统 -1:中断的概念: 在程序运行过程中出现某紧急事件,必须中止当前正在运行的程序,转去处理这个事件,然后再恢复原来运行的程序,这一过程称为中断. -2:中断装置(硬件): 发现并相应中断的硬件结构: 工作: -----…...
嵌入式硬件篇---IIC
文章目录 前言1. IC协议基础1.1 物理层特性两根信号线SCLSDA支持多主多从 标准模式电平 1.2 通信流程起始条件(Start Condition)从机地址(Slave Address)应答(ACK/NACK)数据传输:停止条件&#…...
SAP学习笔记 - 开发08 - Eclipse连接到 BTP Cockpit实例
有关BTP,之前学了一点儿,今天继续学习。 SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)_sap btp开发-CSDN博客 如何在Eclipse中连接BTP Cockpit开发环境实例。 1…...
安装typescript时,npm install -g typescript报错
删除C:\Users\用户\下的.npmrc文件,如果你的没有,看是不是因为将隐藏的项目勾选上了,然后去掉勾选。 重新输入...
支持selenium的chrome driver更新到136.0.7103.92
最近chrome释放新版本:136.0.7103.92 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...
Java在人工智能中的应用:机器学习与深度学习技术探讨
根据您提供的知识库内容,我发现其中主要涉及机器学习和深度学习的内容,而您的文章是关于Java面试技术的。两者的主题并不直接相关,因此无法直接使用知识库中的信息来润色您的文章。 如果您希望将机器学习和深度学习的内容融入文章中…...
C++23 新特性:深入解析 std::views::join_with(P2441R2)
文章目录 std::views::join_with 基本用法处理字符串集合std::views::join_with 与其他视图的结合使用总结 随着C23标准的逐步推进,我们迎来了许多令人兴奋的新特性,其中之一就是 std::views::join_with。这个新特性是C23中引入的视图适配器,…...
【工作记录】crmeb后端项目打开、运行
1、下载代码 1)安装git 不再详述 2)git拉代码 项目地址如下,在vscode-分支中拉代码 # 克隆项目 git clone https://gitee.com/ZhongBangKeJi/crmeb_java/ 截图如下是已经成功拉下来 注意安装对应版本 2、maven配置 安装配置见&#x…...
前端浏览器判断设备类型的方法
前端浏览器判断设备类型的方法 在前端开发中,判断设备类型(如手机、平板、桌面电脑)有多种方法,以下是常用的几种方式: 1. 使用 User Agent 检测 通过 navigator.userAgent 获取用户代理字符串进行判断:…...
python 新闻 api + react js 客户端。
1. 起因, 目的: 前面写了几个爬虫。 那么这些数据怎么使用。使用 api , 看看到底有哪些新闻。感受:最初只是一个想法,然而实现的过程中却很枯燥乏味, 甚至怀疑为什么要做这个事情. 2. 先看效果 效果就是能行。 3.…...
Vivado中可新建的工程类型解析
以下是Vivado中可新建的工程类型解析,按用途和场景分类说明: 1. RTL Project(RTL工程) 用途:从零开始基于RTL代码(Verilog/VHDL)设计FPGA逻辑,覆盖完整开发流程。适用阶段ÿ…...
TypeScript 中的泛型工具详解
TypeScript 提供了一系列强大的泛型工具类型,可以帮助我们更灵活地操作和转换类型。以下是主要的泛型工具类型及其用法: 1. 基础工具类型 1.1. Partial<T> 将类型 T 的所有属性变为可选。 interface User {name: string;age: number; }type Pa…...
OpenCV进阶操作:指纹验证、识别
文章目录 前言一、指纹验证1、什么是指纹验证2、流程步骤 二、使用步骤(案例)三、指纹识别(案例)1、这是我们要识别的指纹库2、这是待识别的指纹图3、代码4、结果 总结 前言 指纹识别作为生物识别领域的核心技术之一,…...
js前端分片传输大文件+mongoose后端解析
最近一直在完善mongoose做webserver的项目,其中程序升级要通过前端传输升级包到服务器。 因为第一次写前端代码,分片传输的逻辑,网上一堆,大同小异,而且版本啊,API不一致的问题,导致头疼的很。后…...
IPLOOK超轻量核心网,助力5G专网和MEC边缘快速落地
随着5G深入千行百业,行业客户对核心网的灵活性、可控性和部署效率提出了更高要求。IPLOOK面向数字化转型需求,推出了超轻量级核心网解决方案,具备体积小、资源占用少、部署灵活、易于维护等特性,广泛适用于专网、实验室、MEC边缘云…...
Spring框架(一)
Spring框架是Java开发中最为流行的框架之一,它以其强大的功能和灵活的设计,极大地简化了企业级应用的开发。本文将详细介绍Spring框架的核心概念、核心技术、依赖注入、多配置文件方式、开发程序的方式、IOC注解方式以及Spring与JUnit的整合。 目录 一、…...
Redis 基础详解:从入门到精通
在当今互联网应用开发领域,数据存储与处理的性能和效率至关重要。Redis(Remote Dictionary Server)作为一款开源的、基于内存的键值存储系统,凭借其出色的性能和丰富的功能,被广泛应用于数据库、缓存、消息中间件等场景…...
24、TypeScript:预言家之书——React 19 类型系统
一、预言家的本质 "TypeScript是魔法世界的预言家之书,用静态类型编织代码的命运轨迹!" 霍格沃茨符文研究院的巫师挥动魔杖,类型注解与泛型的星轨在空中交织成防护矩阵。 ——基于《国际魔法联合会》第12号类型协议,Ty…...
RabbitMQ--进阶篇
RabbitMQ 客户端整合Spring Boot 添加相关的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 编写配置文件,配置RabbitMQ的服务信息 spri…...
【GESP真题解析】第 19 集 GESP 二级 2025 年 3 月编程题 1:等差矩阵
大家好,我是莫小特。 这篇文章给大家分享 GESP 二级 2025 年 3 月编程题第 1 题:等差矩阵。 题目链接 洛谷链接:B4259 等差矩阵 一、完成输入 根据题意,一行,两个正整数 n,m。 n 和 m的数据范围…...
电池单元和电极性能
电芯设计中的挑战 对于电池制造商来说,提高电池能量和功率密度至关重要。在高功率密度和长循环寿命之间取得平衡是电池设计中的关键挑战,通常需要仔细优化材料、电极结构和热管理系统。另一个关键挑战是通过优化重量体积比来降低电池单元的总体成本。 工…...
MATLAB 矩阵与数组操作基础教程
文章目录 前言环境配置一、创建矩阵与数组(一)直接输入法(二)特殊矩阵生成函数(三)使用冒号表达式创建数组 二、矩阵与数组的基本操作(一)访问元素(二)修改元…...
理解 Token 索引 vs 字符位置
以下是对“理解 Token 索引与字符位置的区别”的内容整理,条理清晰,结构完整,保持技术细节,方便阅读,无多余解释: 🔍 理解 Token 索引 vs 字符位置 文本分块方法中返回的索引是 token 索引&…...
【RAG】11种Chunking Strategies分块策略介绍和选择
【今日鸡汤】学习之路上,勤奋是比 “聪明” 远远更珍贵的品质。 参考原文地址:https://masteringllm.medium.com/11-chunking-strategies-for-rag-simplified-visualized-df0dbec8e373 在构建强大的检索增强生成(RAG)系统时&…...
中继器:网络中的“血包”与“加时器”
在探讨网络技术时,我们往往会遇到各种专业术语和设备,中继器便是其中之一。然而,对于非技术人员或初学者来说,这些概念可能显得抽象且难以理解。今天,我将通过一个生动的比喻——将中继器比作网络中的“血包”与“加时…...
证明当||x||=1时,Ax=0的最小二乘解是的最小特征值对应的特征向量
问题:证明当||x||1时,Ax0的最小二乘解是的最小特征值对应的特征向量。 证明: 上个命题等同于:的最小特征值所对应的特征向量可使得||Ax||最小。以下分别对x为的特征向量和不为的特征向量这两种情况进行证明。 情况1: 若x为的特征…...
AI大模型学习十八、利用Dify+deepseekR1 +本地部署Stable Diffusion搭建 AI 图片生成应用
一、说明 最近在学习Dify工作流的一些玩法,下面将介绍一下Dify Stable Diffusion实现文生图工作流的应用方法 Dify与Stable Diffusion的协同价值 Dify作为低代码AI开发平台的优势:可视化编排、API快速集成 Stable Diffusion的核心能力:高效…...
linux基础操作4------(权限管理)
一.前言 今天我们来讲讲linux的权限管理,比如文件的权限,如果大家看过前面说的app逆向的frida,我们在手机里要给frida,我们都要设置一下chomd 777 frida ,这样就给了可执行权限,这就是这一章要讲的&#x…...
Linux数据库篇、第零章_MySQL30周年庆典活动
MySQL考试报名网站 Oracle Training and Certification | Oracle 中国 活动时间 2025年 MySQL的30周年庆典将于2025年举行。MySQL于1995年首次发布,因此其30周年纪念日是2025年。为了庆祝这一里程碑,MySQL将提供免费的课程和认证考试,活动…...
HVV面试题汇总合集
应急响应的命令 Linux ps -aux 查看进程 netstat -antlp 查看端口 top查看 cpu使用情况 Windows tasklist 查看进程 netstat -an 查看端口struts2原理特征 原理: 045:默认的content-type解析器会把用户传来的数据直接当成代码执行,造成rce 特征:ognl表达式&…...
Mac下Robotframework + Python3环境搭建
1.安装python3 1.0安装XCODE 1.打开浏览器,登陆苹果开发者网站:https://developer.apple.com/download/more/ 2.登陆你的apple账号,授权访问。 3.查看mac系统版本 需要下载与系统版本对应的Xcode 4.在搜索框中输入: 如果Mac 系统…...
stm32实战项目:无刷驱动
目录 系统时钟配置 PWM模块初始化 ADC模块配置 霍尔接口配置 速度环定时器 换相逻辑实现 主控制循环 系统时钟配置 启用72MHz主频:RCC_Configuration()设置PLL外设时钟使能:TIM1/ADC/GPIO时钟 #include "stm32f10x.h"void RCC_Configu…...
MNIST 手写数字分类
转自我的个人博客: https://shar-pen.github.io/2025/05/04/torch-distributed-series/1.MNIST/ 基础的单卡训练 本笔记本演示了训练一个卷积神经网络(CNN)来对 MNIST 数据集中的手写数字进行分类的过程。工作流程包括: 数据准备ÿ…...
【RuntimeError: Directory ‘static/‘ does not exist 】
背景 File “/root/miniforge3/lib/python3.10/site-packages/starlette/staticfiles.py”, line 56, in init raise RuntimeError(f"Directory ‘{directory}’ does not exist") RuntimeError: Directory ‘static/’ does not exist 运行读取pdf时候,…...
SQL:SELF JOIN(自连接)与CROSS JOIN(交叉连接)
目录 SELF JOIN(自连接) CROSS JOIN(交叉连接 / 笛卡尔积) 示例: SELF JOIN CROSS JOIN 如果没有 DATEDIFF() 函数怎么办? 🔍 SELF JOIN vs CROSS JOIN 对比总结 SELF JOIN(自…...
Linux网络基础 -- 局域网,广域网,网络协议,网络传输的基本流程,端口号,网络字节序
目录 1. 计算机网络背景 1.1 局域网 1.1.2 局域网的组成 1.2 广域网 1.1.2 广域网的组成 2. 初始网络协议 2.1 网络协议的定义和作用 2.2 网络协议的分层结构 2.2.1 OSI七层模型 2.2.2 TCP/IP 五层(四层)模型 3. 再识网络协议 3.1 为什么要有…...