当前位置: 首页 > wzjs >正文

管理网站建设公司好吗科技画

管理网站建设公司好吗,科技画,wordpress如何更换空间,济南市商务局官方网站MyBatis 提供了 ExecutorType.BATCH 类型,允许将多个 SQL 语句进行组合,最后统一执行,从而减少数据库的访问频率,提升性能。 以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点: 1. 配置 MyBatis 使…

MyBatis 提供了 ExecutorType.BATCH 类型,允许将多个 SQL 语句进行组合,最后统一执行,从而减少数据库的访问频率,提升性能。

以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点:

1. 配置 MyBatis 使用 ExecutorType.BATCH

主要有两种方式可以来配置 MyBatis 使用 BATCH 执行器类型:

a) 在 SqlSessionFactoryBean 中配置 (推荐在 Spring Boot 中使用):

在 Spring Boot 应用中,通常通过 SqlSessionFactoryBean 来配置 SqlSessionFactory。我们可以在 SqlSessionFactoryBean 中设置 defaultExecutorType 属性为 BATCH

import org.apache.ibatis.session.ExecutorType;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configuration
public class MyBatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 设置默认的 ExecutorType 为 BATCHorg.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();configuration.setDefaultExecutorType(ExecutorType.BATCH);factoryBean.setConfiguration(configuration);// ... 其他配置,例如 Mapper 扫描路径等return factoryBean;}
}

b) 编程式的方式创建 SqlSession 时指定 ExecutorType.BATCH:

如果需要更细粒度的控制,或者只想在特定的操作中使用批量处理,可以在创建 SqlSession 时指定 ExecutorType.BATCH

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
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 UserService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;@Autowiredprivate UserMapper userMapper;@Transactionalpublic void batchInsertUsers(List<User> users) {try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {UserMapper batchMapper = sqlSession.getMapper(UserMapper.class);for (User user : users) {batchMapper.insertUser(user); // 执行插入操作}sqlSession.flushStatements(); // 刷新批处理语句,执行批量操作sqlSession.commit(); // 提交事务}}
}

2. 在 Mapper XML 文件中编写批量操作 SQL

在 Mapper XML 文件中,需要编写能够处理集合参数的 SQL 语句,通常使用 <foreach> 标签来循环遍历集合并构建批量 SQL。

a) 批量 INSERT 示例:

假设有一个 User 实体类,你需要批量插入多个用户。

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper"><insert id="batchInsertUsers" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">insert into users (username, password, email) values<foreach collection="list" item="item" separator=",">(#{item.username}, #{item.password}, #{item.email})</foreach></insert><insert id="insertUser" parameterType="com.example.entity.User" useGeneratedKeys="true" keyProperty="id">insert into users (username, password, email) values (#{username}, #{password}, #{email})</insert><!-- ... 其他 Mapper 方法 --></mapper>
  • parameterType="java.util.List": 指定方法参数类型为 List
  • <foreach collection="list" item="item" separator="," >: 循环遍历传入的 Listitem 代表当前循环的元素,separator 指定元素之间的分隔符为逗号 ,
  • (#{item.username}, #{item.password}, #{item.email}): 使用 #{item.propertyName} 获取 User 对象的属性值。
  • useGeneratedKeys="true" keyProperty="id": 如果需要获取自增主键,需要配置 useGeneratedKeyskeyProperty

b) 批量 UPDATE 示例:

批量更新多个用户的邮箱地址。

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper"><update id="batchUpdateUsersEmail" parameterType="java.util.List"><foreach collection="list" item="item" separator=";" open="" close=";" index="index">update users set email = #{item.email} where id = #{item.id}</foreach></update><!-- ... 其他 Mapper 方法 --></mapper>
  • <foreach collection="list" item="item" separator=";" open="" close=";" index="index">: 循环遍历 Listseparator=";" 使用分号作为分隔符。注意: 这里使用了分号 ; 分隔多个 UPDATE 语句。不同的数据库对批量 UPDATE 的语法支持可能有所不同,有些数据库可能不支持这种方式,或者有其他更高效的批量更新语法。例如 MySQL 可以使用 INSERT ... ON DUPLICATE KEY UPDATEREPLACE INTO 等。

3. Spring Boot Service 层调用批量操作 Mapper 方法

在 Spring Boot Service 层,需要调用 Mapper 接口中定义的批量操作方法,并传入包含数据的 List务必使用 @Transactional 注解来管理事务,确保批量操作的原子性

import com.example.entity.User;
import com.example.mapper.UserMapper;
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 UserService {@Autowiredprivate UserMapper userMapper;@Transactionalpublic void batchInsertUsers(List<User> users) {userMapper.batchInsertUsers(users);}@Transactionalpublic void batchUpdateUsersEmail(List<User> users) {userMapper.batchUpdateUsersEmail(users);}
}

4. 性能优化的关注点

  • 事务管理 (@Transactional): 批量操作必须在事务中进行,以保证操作的原子性。如果批量操作过程中出现错误,可以回滚所有操作,保持数据一致性。Spring Boot 的 @Transactional 注解可以方便地管理事务。

  • 批量大小 (Batch Size): 批量操作并非批量越大越好。过大的批量可能会导致:

    • 数据库压力过大: 单次请求发送大量 SQL 可能导致数据库服务器资源消耗过高。
    • 内存占用过高: 如果批量操作涉及到大量数据,可能会占用大量内存。
    • 事务时间过长: 过长的事务会增加锁冲突的风险,影响并发性能。

    最佳批量大小需要根据实际场景进行测试和调优。一般来说,可以尝试从较小的批量大小开始(例如 100, 500, 1000),逐步增加并监控数据库性能,找到最佳的平衡点。

  • 数据库连接池配置: 确保数据库连接池配置合理,能够支持高并发的批量操作。Spring Boot 默认使用 HikariCP 连接池,性能良好,但仍需根据应用负载调整连接池参数,例如 maximum-pool-size, minimum-idle 等。

  • 网络延迟: 批量操作的主要优势是减少网络 round trips。如果网络延迟较高,批量操作的性能提升会更加明显。

  • 数据库服务器性能: 最终性能也受限于数据库服务器的性能。确保数据库服务器配置合理,性能良好,例如 CPU, 内存, 磁盘 IO 等。

  • 批量操作的适用场景: 批量操作最适合一次性处理大量数据的场景,例如数据导入、数据迁移、批量更新状态等。对于频繁的小批量操作,可能提升效果不明显,甚至可能因为额外的批处理开销而降低性能。

  • Generated Keys 的处理: 如果批量 INSERT 需要获取自增主键,MyBatis 提供了 useGeneratedKeyskeyProperty 属性。但需要注意,不同数据库对批量获取自增主键的支持程度可能有所不同。对于 MySQL,批量 INSERT 可以一次性获取所有自增主键。

  • 错误处理: 批量操作中如果某条 SQL 执行失败,需要妥善处理错误。默认情况下,MyBatis 的 ExecutorType.BATCH 在遇到错误时会停止执行后续的 SQL。我们需要根据业务需求,决定是忽略错误继续执行,还是回滚整个批量操作。

总结:

在 Spring Boot 项目中使用 MyBatis 的 ExecutorType.BATCH 进行批量操作,可以显著提升处理大量数据的性能。关键在于正确配置 ExecutorType.BATCH,编写高效的批量 SQL 语句,合理设置批量大小,并结合事务管理和错误处理机制。 性能优化是一个迭代过程,需要根据实际应用场景和性能测试结果进行调整和完善。


文章转载自:

http://5KbgjvKO.rygLh.cn
http://rkWbOcBN.rygLh.cn
http://TqqjHBNs.rygLh.cn
http://KJjDG5Qd.rygLh.cn
http://pPndY8Dp.rygLh.cn
http://D72oJLjY.rygLh.cn
http://cVePIlJL.rygLh.cn
http://ewYROv7e.rygLh.cn
http://Lw3nWcWc.rygLh.cn
http://tIY8VLhr.rygLh.cn
http://9DRkA05C.rygLh.cn
http://MhcZv5QA.rygLh.cn
http://EnQbzae3.rygLh.cn
http://BCqAfNKD.rygLh.cn
http://Cmdibgsv.rygLh.cn
http://qkUzw3V1.rygLh.cn
http://MlWEh6Ne.rygLh.cn
http://9JIAOULI.rygLh.cn
http://QhMveNpt.rygLh.cn
http://gti5hSZ2.rygLh.cn
http://Mlqci5av.rygLh.cn
http://vXsImwz7.rygLh.cn
http://MXoUsXJk.rygLh.cn
http://A5KeQefa.rygLh.cn
http://gPLap3JX.rygLh.cn
http://QNPdjYHs.rygLh.cn
http://aslZzmbH.rygLh.cn
http://ZO7X41JI.rygLh.cn
http://IrZlG2Rn.rygLh.cn
http://Icky7mNi.rygLh.cn
http://www.dtcms.com/wzjs/770984.html

相关文章:

  • 智能建站免费关于做美食的小视频网站
  • xml网站地图制作网站界面的版式架构
  • 做网站需服务器吗桂平seo关键词优化
  • iis配置网站无法访问wordpress文章时间
  • 响应式的学校网站优秀的电子商务网站
  • 无锡网站开发电影网站加盟可以做么
  • 内蒙古建设厅建筑网站图片做多的网站是哪个
  • 衡阳网站建设衡阳千度网络个人可以做几个网站
  • 网站建设状态栏百度浏览器极速版
  • 深圳专业做网站哪家好58网站怎么样做效果会更好
  • 景安网站备案 不去拍照企业做app好还是网站好
  • 深圳商业网站建设模板菲律宾有做网站的吗
  • 山东聊城建设学校网站东莞企业网站建设公司
  • 网站底部公司是什么样的深圳市保障性住房官网
  • 网站制作机构宁德市古田县
  • 常州市网站制作dw软件制作网页图片教程
  • 如何给自己公司做网站平原网站建设价格
  • 百度网站推广电话做网站沈阳本地
  • nodejs做网站google seo网站 被k
  • 国外用什么做网站wordpress条件判断
  • 个人网站备案需要多久wordpress 获取插件目录下
  • 怎么自己做网站怎么赚钱三原县城乡建设局网站
  • 开通微网站最出名的网站建设公司
  • 专业手机网站公司哪家好安心保险官方网站
  • 天津定制开发网站网站建设用户使用手册
  • 网站平台在线提交功能网站报价详情
  • 网站可以做哪些内容股票交易网站建设
  • 棕色网站设计泰安人力资源招聘
  • 房地网站制作聊城做网站低费用
  • seo整站优化前端和后端适合什么人