MyBatis 性能优化
1. 引言
1.1 什么是 MyBatis?
MyBatis 是一款流行的 Java 持久层框架,能够将 Java 对象与 SQL 数据库映射起来。与传统的 JDBC 不同,MyBatis 提供了灵活的 SQL 映射功能,使开发者可以专注于业务逻辑,而无需编写冗长的数据库操作代码。
MyBatis 的主要特点包括:
- 轻量级:无需复杂配置即可快速上手。
- 灵活的 SQL:开发者可以直接编写自定义 SQL,而不是依赖于 ORM 自动生成。
- 强大的动态 SQL 支持:通过 XML 或注解生成动态 SQL。
尽管 MyBatis 的灵活性很强,但它的性能往往取决于 SQL 的设计与执行效率,因此在使用时需要特别关注性能问题。
1.2 多表关联和动态 SQL 的应用场景
在实际开发中,多表关联查询和动态 SQL 是 MyBatis 最常见的应用场景之一:
- 多表关联查询:在复杂业务中,不同表的数据往往存在关联关系。例如,用户和订单、商品和分类的关系查询。多表关联查询能够高效地获取所需的数据。
- 动态 SQL:业务需求变化多样,查询条件可能动态变化。MyBatis 的动态 SQL 功能允许根据不同参数生成相应的 SQL 查询,常见于复杂搜索、报表生成等场景。
典型案例:
- 用户管理系统:根据用户信息(姓名、角色、状态)动态筛选,并关联订单表统计购买记录。
- 电商平台:根据商品属性(价格区间、分类、品牌)动态生成查询条件,并关联库存表查询可用数量。
虽然这些场景十分常见,但如果 SQL 编写不当或缺乏优化,可能会导致严重的性能问题。
1.3 性能优化的意义
随着数据量的增加,性能问题往往成为系统瓶颈,特别是在涉及多表关联和动态 SQL 的场景中:
- 响应时间增加:复杂的 SQL 查询会导致响应时间变长,影响用户体验。
- 数据库资源消耗过高:低效的查询会占用大量的数据库资源,如 CPU 和内存,甚至可能引发系统崩溃。
- 系统扩展性受限:当查询性能不足时,系统很难通过增加硬件资源来支撑更高的并发量。
性能优化的目标是:
- 提高系统响应速度,确保用户体验流畅。
- 降低数据库负载,提高资源利用率。
- 提升系统的扩展性,为业务增长提供支持。
因此,在使用 MyBatis 时,了解其性能陷阱并掌握优化方法是开发者必须具备的能力。
2. MyBatis 多表关联中的常见性能陷阱
多表关联查询和动态 SQL 是 MyBatis 的核心功能之一,但如果使用不当,很容易导致性能问题。以下是一些常见的性能陷阱及其原因分析。
2.1 过多的关联查询
问题描述
在多表关联查询中,如果关联的表过多或表之间的关系过于复杂,可能导致以下问题:
- SQL 执行时间过长。
- 数据库计算压力过大。
- 难以维护和优化 SQL。
场景示例
假设有一个三层嵌套的查询,涉及用户表、订单表和商品表,每次查询时需要返回完整的用户订单详情:
SELECT u.name, o.order_id, p.product_name
FROM user u
JOIN orders o ON u.user_id = o.user_id
JOIN product p ON o.product_id = p.product_id
WHERE u.status = 'active';
如果数据量庞大,这种多表关联会导致查询性能急剧下降。
解决方法
- 降低关联表的数量,必要时进行表拆分或数据冗余。
- 对复杂业务场景,考虑将查询拆分为多个步骤并在应用层合并结果。
2.2 动态 SQL 拼接过多
问题描述
动态 SQL 提供了灵活的查询能力,但如果过度使用,可能导致:
- 生成的 SQL 复杂且难以调试。
- 数据库优化器无法选择最优执行计划。
- 缓存命中率低(动态 SQL 每次生成的新语句会导致缓存失效)。
场景示例
以下动态 SQL 会根据不同条件拼接查询:
<where><if test="status != null">AND status = #{status}</if><if test="startDate != null">AND created_date >= #{startDate}</if><if test="endDate != null">AND created_date <= #{endDate}</if>
</where>
当条件组合过多时,生成的 SQL 会呈指数增长。
解决方法
- 限制动态条件数量,避免生成过于复杂的 SQL。
- 使用
trim
或choose
等标签优化拼接逻辑。
2.3 缺少分页支持
问题描述
未对查询结果进行分页处理会导致以下问题:
- 数据量过大时,查询返回的数据超出内存限制。
- 数据库和网络传输压力增加。
场景示例
以下查询没有进行分页控制:
SELECT * FROM orders WHERE status = 'pending';
如果 orders
表中有数百万条记录,单次查询将返回大量数据,影响系统性能。
解决方法
- 始终为查询添加分页参数(
LIMIT
和OFFSET
)。 - 在大数据量场景中,优先考虑主键或游标分页。
2.4 缺少索引优化
问题描述
多表关联查询和条件筛选中,未为关联字段或查询条件字段建立索引,会导致全表扫描,影响性能。
场景示例
以下查询没有为 user_id
和 status
建立索引:
SELECT * FROM orders WHERE user_id = 123 AND status = 'completed';
全表扫描会导致查询时间显著增加。
解决方法
- 为关联字段和条件字段创建合适的索引。
- 定期分析执行计划(
EXPLAIN
)并优化索引设计。
2.5 动态 SQL 导致缓存失效
问题描述
MyBatis 提供了一级和二级缓存,但动态 SQL 生成的语句如果每次都不同,缓存将无法命中,增加数据库查询压力。
场景示例
以下动态 SQL 由于条件组合不固定,导致生成的语句形式不同:
<if test="param1 != null"> AND column1 = #{param1}</if>
<if test="param2 != null"> AND column2 = #{param2}</if>
解决方法
- 规范动态 SQL 的生成,尽量减少无意义的变体。
- 结合缓存策略,尽量复用生成的 SQL。
2.6 N+1 查询问题
问题描述
在多表关联中,如果对每条记录执行一次独立查询,会产生大量小查询,严重影响性能。这种问题被称为 N+1 查询问题。
场景示例
以下代码会为每个用户单独查询其订单:
List<User> users = userMapper.getAllUsers();
for (User user : users) {List<Order> orders = orderMapper.getOrdersByUserId(user.getUserId());
}
如果有 1000 个用户,这段代码将产生 1001 次查询(1 次查询用户 + 1000 次查询订单)。
解决方法
- 使用
JOIN
查询,一次性获取所有需要的数据。 - 利用 MyBatis 的
resultMap
和collection
标签将结果映射为嵌套对象。
3. 性能优化方法详解
在 MyBatis 的多表关联和动态 SQL 中,性能优化至关重要。以下是针对常见性能陷阱的优化方法详解。
3.1 合理设计 SQL
3.1.1 降低关联表数量
- 目标:避免复杂的多表关联。
- 方法:
- 优化业务逻辑,减少非必要的关联查询。
- 对频繁使用的关联表数据进行适当冗余存储,以换取查询效率。
3.1.2 拆分复杂查询
- 目标:将复杂的 SQL 拆分为多个简单的查询。
- 方法:
- 使用临时表或中间表分步查询。
- 在应用层进行数据合并处理,减少数据库负担。
3.2 实现高效分页
3.2.1 使用 LIMIT 和 OFFSET
- 目标:限制查询返回的数据量。
- 示例:
SELECT * FROM orders WHERE status = 'pending' LIMIT 10 OFFSET 20;
3.2.2 主键或游标分页
- 目标:在大数据量分页场景中,提高分页性能。
- 方法:
- 根据主键或唯一索引实现分页,而非使用
OFFSET
。 - 示例:
SELECT * FROM orders WHERE order_id > #{lastOrderId} LIMIT 10;
- 根据主键或唯一索引实现分页,而非使用
3.3 索引优化
3.3.1 如何创建覆盖索引
- 目标:避免全表扫描,加快查询速度。
- 方法:
- 创建包含所有查询字段的覆盖索引。
- 示例:
CREATE INDEX idx_user_status ON orders (user_id, status);
3.3.2 索引设计的最佳实践
- 对查询条件中经常使用的字段建立索引。
- 避免为低选择性字段(如布尔值)创建索引。
- 定期检查和清理无用索引。
3.4 使用缓存机制
3.4.1 MyBatis 一级缓存
- 目标:在单个会话中复用查询结果。
- 默认开启,无需额外配置。
3.4.2 MyBatis 二级缓存
- 目标:在不同会话间共享查询结果。
- 配置示例:
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
- 注意:
- 缓存适合频繁查询但不经常更新的数据。
- 动态 SQL 需优化生成逻辑,确保缓存命中率。
3.5 避免 N+1 查询
3.5.1 使用 JOIN 查询
- 目标:一次性获取所有需要的数据。
- 示例:
SELECT u.name, o.order_id FROM user u JOIN orders o ON u.user_id = o.user_id;
3.5.2 使用 ResultMap 和 Collection
- 目标:在单次查询中将结果映射为嵌套对象。
- 配置示例:
<resultMap id="userOrderMap" type="User"><id property="userId" column="user_id"/><result property="name" column="name"/><collection property="orders" ofType="Order"><id property="orderId" column="order_id"/><result property="status" column="status"/></collection> </resultMap>
3.6 监控和分析工具
3.6.1 慢查询日志
- 目标:记录运行时间超过阈值的查询。
- 配置示例(MySQL):
SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; -- 查询时间超过 1 秒记录
3.6.2 数据库执行计划(EXPLAIN)
- 目标:分析 SQL 的执行计划,定位性能瓶颈。
- 使用示例:
EXPLAIN SELECT * FROM orders WHERE user_id = 123;
- 注意查看:
- 是否存在全表扫描。
- 索引是否被正确使用。
3.7 分库分表与读写分离
3.7.1 分库分表
- 目标:解决单表数据量过大的问题。
- 方法:
- 按业务分库:将不同模块的数据存储在不同的数据库中。
- 按字段分表:根据主键或分片键分割大表。
3.7.2 读写分离
- 目标:将写操作分配到主库,读操作分配到从库。
- 方法:
- 使用中间件(如 MyCAT)或数据库自带功能实现。
4. 案例分析
通过具体的案例分析,可以更直观地理解 MyBatis 中的性能问题及优化效果。本节将以常见场景为例,展示问题 SQL、优化方法及性能对比。
4.1 问题场景 SQL 示例
场景描述
在一个电商平台中,需要根据用户筛选条件查询订单及商品详情。查询条件包括:
- 用户状态(
status
) - 订单创建时间范围(
startDate
和endDate
) - 商品分类(
category
)
SQL 示例:
SELECT u.user_id, u.name, o.order_id, o.created_date, p.product_name, p.category
FROM user u
JOIN orders o ON u.user_id = o.user_id
JOIN product p ON o.product_id = p.product_id
WHERE u.status = 'active'AND o.created_date BETWEEN '2023-01-01' AND '2023-12-31'AND p.category = 'electronics';
问题分析
- 过多的关联查询:三表关联导致 SQL 复杂度高。
- 缺少分页:查询可能返回大量数据。
- 未使用索引:
created_date
和category
未建立索引。 - 动态条件不固定:查询条件动态变化,可能导致缓存失效。
4.2 动态 SQL 的优化示例
原始动态 SQL 示例
<select id="getOrders" resultType="map">SELECT u.user_id, u.name, o.order_id, o.created_date, p.product_name, p.categoryFROM user uJOIN orders o ON u.user_id = o.user_idJOIN product p ON o.product_id = p.product_id<where><if test="status != null">AND u.status = #{status}</if><if test="startDate != null and endDate != null">AND o.created_date BETWEEN #{startDate} AND #{endDate}</if><if test="category != null">AND p.category = #{category}</if></where>
</select>
问题优化
-
优化分页
添加分页参数,避免查询返回过多数据:LIMIT #{pageSize} OFFSET #{offset}
-
索引优化
为常用筛选条件字段建立索引:CREATE INDEX idx_status ON user (status); CREATE INDEX idx_created_date ON orders (created_date); CREATE INDEX idx_category ON product (category);
-
减少关联查询复杂度
优化为两步查询,先查询订单,再关联用户和商品:SELECT o.order_id, o.created_date, o.user_id, o.product_id FROM orders o WHERE o.created_date BETWEEN #{startDate} AND #{endDate}AND EXISTS (SELECT 1 FROM user u WHERE u.user_id = o.user_id AND u.status = #{status})AND EXISTS (SELECT 1 FROM product p WHERE p.product_id = o.product_id AND p.category = #{category}) LIMIT #{pageSize} OFFSET #{offset};
4.3 优化前后性能对比
测试环境
- 数据量:
- 用户表:1,000,000 条记录
- 订单表:10,000,000 条记录
- 商品表:500,000 条记录
- 查询条件:
- 用户状态:
active
- 创建时间范围:
2023-01-01
至2023-12-31
- 商品分类:
electronics
- 用户状态:
性能对比表
优化项 | 优化前响应时间 | 优化后响应时间 | 备注 |
---|---|---|---|
多表关联查询 | 12 秒 | 3 秒 | 通过减少关联表数量和两步查询显著提升性能 |
分页处理 | 未测(返回 1GB 数据) | 500ms | 添加分页后返回数据量大幅减少 |
索引优化 | 8 秒 | 300ms | 索引减少了全表扫描,提升查询效率 |
动态 SQL 缓存命中率 | 无法命中 | 命中率 80% | 规范动态 SQL 生成,提高缓存复用率 |
结果总结
通过优化动态 SQL、分页、索引和查询逻辑,将查询性能从 12 秒优化到 300 毫秒,大幅提升了系统效率。在生产环境中,应定期检查 SQL 的执行计划,结合业务需求进一步优化。
5. 高级优化技巧
针对大规模数据和高并发场景,除了基础的性能优化外,还可以采用更高级的优化方案,如分库分表、读写分离与负载均衡,以及数据库连接池调优。
5.1 分库分表方案
5.1.1 什么是分库分表?
分库分表是将一张大表或一个数据库的数据按照一定规则分散存储到多个数据库或表中,从而减少单个库或表的压力,提高查询性能和系统扩展性。
5.1.2 分库分表的类型
-
垂直分库分表
- 按业务模块拆分数据库或表。
- 适用于不同业务模块之间无强关联的场景。
- 示例:
- 用户表存储在
user_db
,订单表存储在order_db
。
- 用户表存储在
-
水平分库分表
- 按一定规则(如用户 ID 或订单 ID)将同一业务数据拆分到多个数据库或表中。
- 适用于单表数据量过大的场景。
- 示例:
orders_001
存储用户 ID 为 1-1000 的订单,orders_002
存储用户 ID 为 1001-2000 的订单。
5.1.3 分库分表的挑战
- 分布式事务:跨库操作需要解决事务一致性问题。
- 查询复杂性:跨库查询和统计需要额外的合并逻辑。
- 路由规则设计:需要设计合理的分片规则,避免数据倾斜。
5.1.4 实现方式
- 使用分库分表中间件(如 ShardingSphere、MyCAT)。
- 自行实现分库分表逻辑,结合数据库代理或路由层。
5.2 读写分离与负载均衡
5.2.1 什么是读写分离?
读写分离是将数据库的写操作分配到主库,读操作分配到从库,从而分散主库的压力,提高系统吞吐量。
5.2.2 读写分离的实现
-
主从复制
- 使用数据库的主从复制功能(如 MySQL 的主从复制),实现主库写数据后同步到从库。
- 主库:处理写请求。
- 从库:处理读请求。
-
读写路由
- 在应用层或中间件中设置读写分离路由规则。
- 示例:
datasource:master: jdbc:mysql://master-db:3306/app_dbslave: jdbc:mysql://slave-db:3306/app_db
5.2.3 负载均衡
- 概念:将读请求分配到多个从库,平衡负载。
- 实现方式:
- 数据库中间件(如 ProxySQL、MaxScale)。
- 应用层通过算法(如轮询、最小连接数)实现。
5.2.4 注意事项
- 数据延迟:主从复制存在延迟,可能导致读取的数据不一致。
- 从库压力:从库需要处理大量查询,可能成为新的瓶颈。
5.3 数据库连接池调优
5.3.1 数据库连接池的重要性
数据库连接池(如 HikariCP、Druid)通过复用连接提升数据库操作效率,是高并发场景的关键优化点。
5.3.2 连接池调优的核心参数
-
最大连接数(maxConnections)
- 定义连接池中最大活跃连接数量。
- 调优建议:
- 根据数据库性能和业务并发量设置。
- 避免过大或过小,过大可能导致数据库连接耗尽,过小可能导致请求阻塞。
-
最小连接数(minConnections)
- 定义连接池中维持的最小空闲连接数。
- 调优建议:
- 设置为低并发场景下的最低需求,节省资源。
-
连接超时时间(connectionTimeout)
- 指定连接池等待可用连接的最大时间。
- 调优建议:
- 设置为合理值(如 30 秒),防止长时间阻塞。
-
空闲连接的最大存活时间(idleTimeout)
- 设置空闲连接的最大保留时间,避免无效连接占用资源。
- 调优建议:
- 设置为 1-5 分钟,具体根据业务需求调整。
5.3.3 监控与调试
- 使用数据库连接池监控工具(如 Druid 的内置监控)。
- 定期检查连接池性能指标(如连接使用率、等待时间)。
6. 总结
通过前文的分析和优化技巧,我们深入探讨了 MyBatis 多表关联和动态 SQL 的常见性能陷阱以及优化方法。在本节中,我们将回顾性能优化的关键点,并梳理在实际项目中应用这些优化时需要注意的事项。
6.1 性能优化的关键点回顾
-
SQL 的合理设计
- 降低多表关联的复杂度,尽可能减少不必要的关联。
- 将复杂的查询拆分为多个简单的查询步骤,在应用层进行数据整合。
-
高效的分页处理
- 使用
LIMIT
和OFFSET
实现分页,避免一次性返回大数据量。 - 在大数据场景中优先使用主键或游标分页以提高效率。
- 使用
-
索引优化
- 针对常用查询条件和关联字段创建合理的索引。
- 定期审查和调整索引,避免无用索引和冗余索引。
-
动态 SQL 的规范化
- 避免过多动态拼接,确保生成的 SQL 语句结构清晰、稳定。
- 优化动态 SQL 的条件设计,提高缓存命中率。
-
缓存机制
- 利用 MyBatis 的一级和二级缓存减少重复查询。
- 对不频繁更新的数据启用二级缓存,提高查询效率。
-
高级优化方案
- 使用分库分表解决大数据量问题,提升系统扩展能力。
- 采用读写分离和负载均衡减轻主库压力。
- 调优数据库连接池参数以优化连接管理。
-
监控与分析
- 使用慢查询日志和数据库执行计划(
EXPLAIN
)定位性能瓶颈。 - 定期监控系统性能,结合实际场景持续优化。
- 使用慢查询日志和数据库执行计划(
6.2 在实际项目中应用的注意事项
-
结合业务需求选择优化策略
- 每种优化策略都有适用场景,不盲目追求复杂的解决方案。
- 在简单场景下,优先优化 SQL 和索引,而非直接引入分库分表等复杂方案。
-
性能与成本的平衡
- 高级优化方案(如分库分表)可能引入额外的开发和维护成本。
- 根据系统规模和业务需求评估优化的必要性,避免过度优化。
-
测试与验证
- 在实施优化前,进行详细的性能测试,验证优化效果。
- 定期对系统进行负载测试,确保优化策略在高并发场景下的稳定性。
-
监控和回滚机制
- 优化后的系统需要持续监控,确保在实际运行中的效果。
- 为所有优化措施设计回滚机制,确保在紧急情况下能快速恢复。
-
关注团队协作与维护
- 在团队中分享优化的最佳实践,统一编码规范和 SQL 优化标准。
- 针对复杂优化方案,完善文档和监控,便于后续维护。
7. 扩展阅读
在学习和实践 MyBatis 性能优化的过程中,深入了解相关工具和技术的原理与最佳实践至关重要。本节提供一些重要的参考资料,供读者进一步扩展学习。
7.1 MyBatis 官方文档
推荐阅读内容
- MyBatis 入门指南
- 包括 MyBatis 的基本概念、核心组件及配置方法。
- 动态 SQL
- 详细介绍动态 SQL 的标签及用法。
- 缓存机制
- 讲解一级缓存和二级缓存的使用与配置。
- 性能优化相关章节
- 涉及 MyBatis 在性能优化中的注意事项。
学习建议
- 熟悉 MyBatis 核心配置和动态 SQL 的使用方法,理解其性能特点。
- 实践中通过阅读官方文档深入掌握 MyBatis 的高级特性和限制。
7.2 数据库索引设计的最佳实践
参考资料
- 《高性能 MySQL》
- 包括索引设计、查询优化和性能调优的详细讲解。
- 数据库官方文档(如 MySQL、PostgreSQL)
- 详细说明索引类型、创建方法及优化技巧。
- 社区文章:
- MySQL 索引优化实战
关键内容
- 索引类型:
- 单列索引、复合索引、唯一索引、全文索引。
- 创建原则:
- 为高频查询字段创建索引。
- 优先为区分度高的字段创建索引。
- 常见误区:
- 过多索引会增加写操作的开销。
- 对低选择性字段(如布尔值)创建索引可能无效。
- 索引调试:
- 使用
EXPLAIN
命令分析查询计划,检查索引的使用情况。
- 使用
学习建议
- 理解索引的作用机制,避免常见误区。
- 在实际项目中通过慢查询日志和执行计划优化索引策略。
7.3 高性能分页的研究与实现
参考资料
- MySQL 高性能分页技术
- 涉及
LIMIT
和OFFSET
的使用技巧及优化方法。
- 涉及
- 技术博客:
- 《深度剖析 MySQL 分页性能问题及优化策略》
- 《大数据分页实现与最佳实践》
关键内容
- 分页方法
- 基础分页:
LIMIT
+OFFSET
。 - 游标分页:通过主键范围限制实现高效分页。
- 基础分页:
- 性能对比
- 使用
OFFSET
时,大偏移量的性能较低。 - 游标分页在大数据量场景下性能表现更优。
- 使用
- 代码实现
- 基础分页:
SELECT * FROM orders LIMIT 10 OFFSET 1000;
- 游标分页:
SELECT * FROM orders WHERE order_id > #{lastOrderId} LIMIT 10;
- 基础分页:
学习建议
- 在项目中根据数据规模和性能需求选择合适的分页策略。
- 深入理解游标分页的原理,特别是在大数据量场景中的应用。
相关文章:
MyBatis 性能优化
1. 引言 1.1 什么是 MyBatis? MyBatis 是一款流行的 Java 持久层框架,能够将 Java 对象与 SQL 数据库映射起来。与传统的 JDBC 不同,MyBatis 提供了灵活的 SQL 映射功能,使开发者可以专注于业务逻辑,而无需编写冗长的…...
【python基础】python内置函数 zip用法介绍
zip() 是 Python 中非常有用的内建函数,能够将多个可迭代对象(如列表、元组、字符串等)打包成一个迭代器,它将对应位置的元素组合成元组,并返回一个由这些元组组成的迭代器。通常用于并行处理多个可迭代对象。 1. 基本…...
Unity Android AAB包GooglePlay上线备忘
aab GooglePlay要求新上线的App必须使用aab格式提交,在Unity Build Settings中勾选Build App Bundle 选项即可;或者在代码中设置: EditorUserBuildSettings.buildAppBundle true; 安装测试 https://developer.android.com/tools/bundlet…...
基于springboot的课程作业管理系统源码(springboot+vue+mysql)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的课程作业管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 可以管理首页、个人中心…...
JVM生产环境常用参数配置及调优建议
一、生产常用参数配置 JAVA_OPTS="-server -Xms4G -Xmx4 -Xmn2G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 -XX:G1HeapRegionSize=16m -XX:MaxGCCount=10 -XX:MetaspaceSize=256m -XX:…...
vue 实现打包并同时上传至服务器端
将 publish_script 及以下文件 upload.server.js 添加到 主文件下,与 src 同级别 具体操作步骤: 1、安装 npm install scp2 2、将下面两条命令加入至 package.json 的 scripts 中 "upload": "node publish_script/upload.server.js&q…...
深入探索AI核心模型:CNN、RNN、GAN与Transformer
在人工智能的飞速发展中,众多深度学习模型和算法不断涌现,推动了许多领域的进步。特别是在图像识别、自然语言处理、生成建模等方向,AI模型的应用越来越广泛。本文将介绍几种最常用的AI模型,包括卷积神经网络(CNN&…...
【Elasticsearch】配置分片分配到指定节点
配置分片分配到指定节点 参考文章:https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation-filtering.html 两种方式:根据节点属性分配和根据节点名称分配。 测试环境 tar xvf elasticsearch-7.17.25-linux-x86_64.tar.gz…...
【贵州省】乡镇界arcgis格式shp数据乡镇名称和编码内容下载测评
shp数据字段乡镇名称和编码,坐标是wgs84,数据为SHP矢量格式,下载下来直接加载进ArcMap即可使用 下载地址:https://download.csdn.net/download/zhongguonanren99/14928126...
EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端
产品需求: 前端上传个csv 或 excel 文件,文件共4列,验证文件大小,类型,文件名长度,文件内容,如果某行某个单元格数据验证不通过,就把错误信息放到这行第五列,然后把带有…...
Python 植物大战僵尸
文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路: 导入必要的库和模块:首先,我们导入了Python的os、time库以及pygame库,还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…...
继承(7)
大家好,今天我们继续来学习一下继承的知识,这方面需要大家勤动脑才能理解,那么我们来看。 1.9 protected关键字 在类和对象章节中,为了实现封装特性,java中引入访向限定符,主要限定:类或者类中成员能否在类外和其他包中被访问. …...
UML(统一建模语言)
目录 一、用例图(Use Case Diagram) 二、类图(Class Diagram) 2.1、泛化(Generalization) 2.2、实现(Realization) 2.3、关联(Association) 2.4、聚合&…...
【面试题】技术场景 7、定位系统瓶颈
系统瓶颈定位方法总述 面试官询问如何快速定位系统瓶颈,旨在考察线上调试经验。主要方法包括: 压测:在项目上线前找出系统瓶颈并修复。监控工具或链路追踪工具:项目上线后用于实时监控或评测找瓶颈。Arthas(原阿尔萨…...
计算机网络之---传输层的功能
传输层的功能 传输层是 OSI(开放系统互联)七层模型中的第四层,位于应用层和网络层之间。传输层的主要作用是提供端到端的通信服务,确保数据在不同设备之间的可靠传输。它主要负责将来自上层(应用层)的数据拆…...
设计一个利用事务特性可以阻塞线程的排他锁,并且通过注解和 AOP 来实现
设计思路: 利用数据库表记录锁标识:通过唯一标识符(如方法名 参数),我们可以在数据库中插入一条记录,表示当前方法正在执行。这条记录需要记录插入时间。 注解:通过注解标识哪些方法需要加锁&a…...
《安富莱嵌入式周报》第348期:开源低功耗测试仪,开源创意万用表,续航100-300小时,开源PCB电机,自制shell和网络协议栈,开源水培自动化系统
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1Tzr9Y3EQ7/ 《安富莱嵌入式周报》第348期:开源低功…...
C#实现凸壳算法
凸壳计算代码: public static PointD[] calcConvexHull(PointD[] points) {// 按 x 坐标对点进行排序Array.Sort(points, (p1, p2) => p1.X.CompareTo(p2.X));// 创建下凸壳var lowerHull = new List<PointD>();foreach (var point in points){while (lowerHull.Co…...
轻量级适合阅读的优秀 C++ 开源项目
CTPL 这是一个现代简易版的、高效的C线程池库,代码行数500行左右。 代码示例: void first(int id) { std::cout << "hello from " << id << \n; } struct Second { void operator()(int id) const { std::cout << &q…...
数据结构:栈(Stack)和队列(Queue)—面试题(一)
目录 1、括号匹配 2、逆波兰表达式求值 3、栈的压入、弹出序列 4、最小栈 1、括号匹配 习题链接https://leetcode.cn/problems/valid-parentheses/description/ 描述: 给定一个只包括 (,),{,},[,] …...
20250110-System类
1. 定义 java不支持全局变量和方法,因此将与系统相关的重要方法和变量放在了一个统一的类中,即System类,其中所有的成员都是静态的。 2. System类中的方法 PS: System.out.print(),其中的out是System的静态变量&am…...
初识verilog HDL
为什么选择用Verilog HDL开发FPGA??? 硬件描述语言(Hardware Descriptipon Lagnuage,HDL)通过硬件的方式来产生与之对应的真实的硬件电路,最终实现所设计的预期功能,其设计方法与软件…...
JavaSE——网络编程
一、InetAddress类 InetAddress是Java中用于封装IP地址的类。 获取本机的InetAddress对象: InetAddress localHost InetAddress.getLocalHost();根据指定的主机名获取InetAddress对象(比如说域名) InetAddress host InetAddress.getByNa…...
antd-design-vue1.7.8浏览器中使用
快速开始 引入js和css <link href"antd/antd.css" rel"stylesheet"> <script src"vue2/vue.js" type"text/javascript"></script> <script src"antd/antd.js" type"text/javascript">&…...
车载网络:现代汽车的数字心跳
在汽车领域,“智能汽车”一词毫不夸张。如今的汽车已不再是原始的机械工程,而是通过先进的车载网络无缝连接的精密数字生态系统。这些滚动计算机由复杂的电子控制单元(ECU)网络提供动力,ECU是负责管理从发动机性能到信息娱乐系统等一切事务的…...
SAP SD学习笔记27 - 贩卖契约(框架协议)2 - 基本契约 - 金额契约(价值合同)
上一章讲了贩卖契约(框架协议)的概要,以及贩卖契约中最为常用的 基本契约 - 数量契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要,基本契约 - 数量契约-CSDN博客 本章继续讲SAP中的内容: - 基本契约 - 金额契约…...
56. Three.js案例-创建一个包含点光源和旋转立方体的3D场景
56. Three.js案例-创建一个包含点光源和旋转立方体的3D场景 实现效果 本案例展示了Three.js中如何创建一个带有点光源的场景,并在该场景中添加一个旋转的立方体。通过点光源辅助线,可以直观地看到光源的位置和影响范围。 知识点 WebGLRenderer (WebGL…...
python-42-使用selenium-wire爬取微信公众号下的所有文章列表
文章目录 1 seleniumwire1.1 selenium-wire简介1.2 获取请求和响应信息2 操作2.1 自动获取token和cookie和agent2.3 获取所有清单3 异常解决3.1 请求url失败的问题3.2 访问链接不安全的问题4 参考附录1 seleniumwire Selenium WebDriver本身并不直接提供获取HTTP请求头(header…...
Excel使用
COUNTA,统计单列或单行中的非空单元格 COUNT: 纯数字COUNTBLANK: 空白 COUNTA(value1, [value2], ...) COUNTA(A1:A10) COUNTA(A1:C5) COUNTA(IF(A1:A10>10, A1:A10)) COUNTA(A:A)某一列的全部 (D1:INDEX(D:D,COUNTA(D:D))计算一列不同词语的不同频率 单独的词每个词的频…...
机器人碳钢去毛刺,用大扭去毛刺主轴可轻松去除
在碳钢精密加工的最后阶段,去除毛刺是确保产品质量的关键步骤。面对碳钢这种硬度较高的材料,采用大扭矩的SycoTec去毛刺主轴,成为了行业内的高效解决方案。SycoTec作为精密加工领域的领军品牌,其生产的高速电主轴以其卓越的性能&a…...
Android车载音频系统目录
目录 第一章 1.1 Android Automotive(一) 1.2 Android Automotive(二) 1.3 Android Automotive(三) 第二章 2.1 Android车载音频系统概览 2.2 车载音频焦点 2.3 车载音频配置 2.4 Audio control HAL…...
备战蓝桥杯 链表详解
目录 链表概念 静态单链表的实现 静态双链表的实现 循环链表 算法题练习: 1.排队顺序 2.单向链表 3.队列安排 4.约瑟夫问题 链表概念 上一次我们用顺序存储实现了线性表,这次我们用链式存储结构实现的线性表就叫链表 链表每个节点包含数据本身…...
基于华为Maas(大模型即服务)和开源的Agent三方框架构建AI聊天助手实践
引言 随着人工智能技术的快速发展,AI聊天助手已经成为企业与用户之间沟通的重要桥梁。为了构建一个高效、智能且易于扩展的AI聊天助手,我们可以利用华为云提供的Maas(Model-as-a-Service,大模型即服务)平台,结合开源的Agent三方框架来实现。本文将详细介绍这一实践过程,…...
Python基于YOLOv8和OpenCV实现车道线和车辆检测
使用YOLOv8(You Only Look Once)和OpenCV实现车道线和车辆检测,目标是创建一个可以检测道路上的车道并识别车辆的系统,并估计它们与摄像头的距离。该项目结合了计算机视觉技术和深度学习物体检测。 1、系统主要功能 车道检测&am…...
【如何从0到1设计测试用例使用Fiddler完成弱网测试】
🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 ⭐⭐⭐测试用…...
PHP语言的函数实现
PHP语言的函数实现 在现代Web开发中,PHP是一种流行的后端脚本语言。它以简单易学和强大的功能著称,广泛应用于构建动态网站和Web应用程序。在PHP中,函数是组织代码、提高代码重用性和可读性的关键元素。本文将深入探讨PHP的函数实现…...
开源生成式物理引擎Genesis,可模拟世界万物
这是生成大模型时代 —— 它们能生成文本、图像、音频、视频、3D 对象…… 而如果将所有这些组合到一起,我们可能会得到一个世界! 现在,不管是 LeCun 正在探索的世界模型,还是李飞飞想要攻克的空间智能,又或是其他研究…...
Apache Paimon-实时数据湖
一、Apache Paimon是什么? Flink社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehouse 新架构优势进一步结合,推出新一代的 Streaming Lakehouse 技术,促进数据在数据湖上真正实时流动起来,并为用户提供实时离线一体化的开发体验。 …...
Git:Cherry-Pick 的使用场景及使用流程
前面我们说了 Git合并、解决冲突、强行回退等解决方案 >> 点击查看 这里再说一下 Cherry-Pick功能,Cherry-Pick不是merge,只是把部分功能代码Cherry-Pick到远程的目标分支 git cherry-pick功能简介: git cherry-pick 是用来从一个分…...
蓝桥杯---纯职业小组(c语言)
问题描述 在蓝桥王国,国王统治着一支由n 个小队组成的强大军队。每个小队都由相同职业的士兵组成。具体地,第i 个小队包含了 bi名职业为ai的士兵。近日,国王计划在王宫广场举行一场盛大的士兵检阅仪式,以庆祝王国的繁荣昌盛。然而…...
先辑芯片HPM5300系列之SEI多摩川协议命令表问题研究
多摩川协议有9条命令,但是先辑SEI的命令表只有8张。0-6是可用的,第7张是黑洞表,所以只有7张可用。 命令表的限制颇多,比如命令表只能按顺序使用 :例如0、1、3,那么命令表3是不能用的。 如果想要实现9个命令…...
C++:string
一、string概念 之前介绍过通过字符数组保存字符串,然后对字符数组中的字符串做各种操作;为了更加简单方便,在C中,又增加了 string 来处理字符串。 char str[20] "hello world"; string 字符串其实是一种更加高级的封…...
用c实现C++类(八股)
在 C 语言中,虽然没有内建的面向对象编程(OOP)特性(如封装、继承、多态),但通过一些编程技巧,我们仍然可以模拟实现这些概念。下面将用通俗易懂的方式,逐步介绍如何在 C 中实现封装、…...
一区10+!线粒体基因组+宏基因组,微生态研究跨界新组合
在自然界中,微生物与宿主之间的共生关系是生物多样性和生态系统功能的重要组成部分。这些相互作用不仅塑造了宿主的进化历程,而且对宿主的生存和适应性至关重要。然而,这些共生关系的进化动态和共生菌基因组的演变仍然是微生物生态学和进化生…...
基于Python编程语言的自动化渗透测试工具
摘 要 近些年来网络安全形势变得越来越严峻,全球数百万个政企遭遇过不同程度的网络攻击。渗透测试是一种对目标进行信息安全评估的方法,而目前该行业仍在存在着安全服务行业价格昂贵,安全人才缺口巨大,在渗透测试时步骤繁琐、效率…...
浅析大语言模型安全和隐私保护国内外标准和政策
过去两年,大模型技术已经普及并逐步渗透到各行各业,2025年注定是大模型应用井喷式发展的一年,AI在快速发展的同时,其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载:600多…...
C++例程:使用I/O模拟IIC接口(6)
完整的STM32F405代码工程I2C驱动源代码跟踪 一)myiic.c #include "myiic.h" #include "delay.h" #include "stm32f4xx_rcc.h" //初始化IIC void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphCl…...
【YOLOv8杂草作物目标检测】
YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结: 农作物幼苗与杂草检测系统:基于YOLOv8深度学习框架,通过2822张图片训练了一个目标检测模型ÿ…...
Mysql--基础篇--SQL(DDL,DML,窗口函数,CET,视图,存储过程,触发器等)
SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的标准语言。它允许用户定义、查询、更新和管理数据库中的数据。SQL是一种声明性语言,用户只需要指定想要执行的操作,而不需要详细说明如何…...
[Transformer] The Structure of GPT, Generative Pretrained Transformer
The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work...