国家卫生计生委能力建设和继续教育网站/优化网站排名需要多少钱

国家卫生计生委能力建设和继续教育网站,优化网站排名需要多少钱,一 建设网站前的市场分析,网站设计制作厂家有哪些引言 在分布式系统架构中,SpringBoot与MyBatis的组合已成为企业级开发的黄金搭档。但在实际项目中,开发者常面临多数据源管理、SQL性能优化、分布式事务等挑战。本文将从实战角度出发,分享7个关键技巧和避坑指南。 一、多数据源动态切换实战…

引言

在分布式系统架构中,SpringBoot与MyBatis的组合已成为企业级开发的黄金搭档。但在实际项目中,开发者常面临多数据源管理、SQL性能优化、分布式事务等挑战。本文将从实战角度出发,分享7个关键技巧和避坑指南。


一、多数据源动态切换实战

1.1 多数据源配置

@Configuration
public class DataSourceConfig {@Bean(name = "masterDataSource")@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "slaveDataSource")@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource slaveDataSource() {return DataSourceBuilder.create().build();}
}

1.2 动态数据源路由

public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.getDataSourceType();}
}// 使用AOP实现自动切换
@Around("execution(* com.example.service..*.*(..))")
public Object around(ProceedingJoinPoint point) {MethodSignature signature = (MethodSignature) point.getSignature();DataSourceSwitch dataSource = signature.getMethod().getAnnotation(DataSourceSwitch.class);if(dataSource != null){DataSourceContextHolder.setDataSourceType(dataSource.value());}// 执行方法...
}

注意点

  • 事务管理需使用@Transactional(transactionManager = "txManager")
  • 连接池推荐使用HikariCP
  • 读写分离场景建议结合AbstractRoutingDataSource+注解方式

二、MyBatis进阶使用技巧

2.1 动态SQL最佳实践

<select id="searchUsers" resultType="User">SELECT * FROM users<where><if test="name != null">AND name LIKE CONCAT('%',#{name},'%')</if><if test="status != null">AND status = #{status}</if><choose><when test="orderBy == 'name'">ORDER BY name</when><otherwise>ORDER BY create_time DESC</otherwise></choose></where>
</select>

2.2 自定义TypeHandler

处理枚举类型和加密字段:

public class EncryptTypeHandler extends BaseTypeHandler<String> {private final Encryptor encryptor = new AESEncryptor();@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) {ps.setString(i, encryptor.encrypt(parameter));}// 其他方法实现解密...
}// 实体类使用
public class User {@TableField(typeHandler = EncryptTypeHandler.class)private String mobile;
}

三、性能优化三板斧

3.1 批量插入优化

public void batchInsert(List<User> users) {SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);try {UserMapper mapper = sqlSession.getMapper(UserMapper.class);for (User user : users) {mapper.insert(user);}sqlSession.commit();} finally {sqlSession.close();}
}

3.2 二级缓存配置

<settings><setting name="cacheEnabled" value="true"/>
</settings><!-- Mapper级别开启 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

缓存策略建议

  • 读多写少的数据适合开启缓存
  • 分布式环境建议集成Redis
  • 及时清理关联表的缓存数据

四、分布式项目中的特殊处理

4.1 分页查询优化

// 使用PageHelper实现物理分页
PageHelper.startPage(1, 10, "id DESC");
List<User> users = userMapper.selectByCondition(condition);
PageInfo<User> pageInfo = new PageInfo<>(users);// 深度分页优化(基于游标)
@Select("SELECT * FROM users WHERE id > #{lastId} ORDER BY id LIMIT #{size}")
List<User> selectByScroll(@Param("lastId") Long lastId, @Param("size") int size);

4.2 SQL拦截器开发

公共字段自动填充插件示例:

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class AutoFillInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object parameter = invocation.getArgs()[1];if(parameter instanceof BaseEntity){BaseEntity entity = (BaseEntity) parameter;entity.setUpdateTime(new Date());entity.setUpdater(getCurrentUser());}return invocation.proceed();}
}

五、避坑指南

5.1 警惕N+1查询问题

<!-- 错误示范 -->
<resultMap id="userMap" type="User"><collection property="orders" select="selectOrdersByUserId" column="id"/>
</resultMap><!-- 正确方案:使用JOIN查询 -->
<select id="selectUserWithOrders" resultMap="userOrderMap">SELECT u.*, o.* FROM users uLEFT JOIN orders o ON u.id = o.user_id
</select>

5.2 事务使用原则

  • 方法间调用避免this调用导致AOP失效
  • 只读事务添加@Transactional(readOnly = true)
  • 分布式事务建议使用Seata方案

结语

在SpringBoot分布式架构中,合理运用MyBatis的特性可以显著提升开发效率和系统性能。但切记:

  1. 多数据源配置要处理好事务边界
  2. 动态SQL保持简洁可维护
  3. 缓存策略需结合业务特点
  4. 监控慢SQL(推荐使用p6spy)

下一期预告:《SpringBoot+MyBatis整合Redis二级缓存实战》——我们将深入探讨如何构建高性能分布式缓存方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大模型基础_毛玉仁】4.1 参数高效微调简介

目录 4 参数高效微调4.1 参数高效微调简介4.1.1 下游任务适配1&#xff09;上下文学习&#xff08;In-context learning&#xff09;2&#xff09;指令微调&#xff08;Instruction Tuning&#xff09; 4.1.2 参数高效微调4.1.3 参数高效微调的优势 4 参数高效微调 大语言模型…

Postman使用02、断点、fiddler弱网测试

脚本操作 一、脚本导出 1.导出json脚本 2.打包json文件 3.下载的文件 二 .导入脚本 1.选择文件 2.点击导入 3.导入的接口 三.多接口运行 1.集合右键&#xff0c;点击run &#xff0c;运行多个接口 2.编辑环境&#xff0c;集合&#xff0c;执行次数等 3.运行多个接口 四.运行…

MySQL 调优:查询慢除了索引还能因为什么?

文章目录 情况一&#xff1a;连接数过小情况二&#xff1a;Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么&#xff1f;MySQL 查询慢&#xff0c;我们一般也会想到是因为索引&#xff0c;但除了索引还有哪些原因会导致数据库查询变慢呢&#xff1f; 以下以 MySQL 中一条 S…

【操作系统】进程三种状态?进程间状态的切换?挂起态?

进程状态 进程的五种&#xff08;三种&#xff09;状态&#xff1a; 新建&#xff08;New&#xff09;&#xff1a;进程刚被创建&#xff0c;尚未加入到就绪队列&#xff1b;就绪&#xff08;Ready&#xff09;&#xff1a;进程已获得除CPU外的所有资源&#xff0c;等待被调度执…

计算机控制系统的最小拍控制器设计及仿真分析

1题目 开环传递函数 G(s) 2/(s(0.5s1)) &#xff0c;采样周期 T0.5 秒&#xff0c;设计单位速度输入下的最小拍控制器 1.1 方法1 根据课本中的步骤&#xff0c;最小拍控制器的设计步骤如下&#xff1a; 1. 确定对象的离散传递函数G(z)&#xff0c;并确定其零极点。 2. 确定…

哈希--哈希桶

哈希桶是哈希表&#xff08;散列表&#xff09;中的一个概念&#xff0c;是哈希表数组中的每个元素 &#xff0c;用于存储键值对数据。它有以下特点和相关要点&#xff1a; 结构与原理&#xff1a;哈希表底层常由数组构成&#xff0c;数组的每个元素即哈希桶。通过哈希函数计算…

Linux多线程详解

Linux多线程详解 一、Linux多线程概念1.1 什么是线程1.2 进程和线程1.3 进程的多个线程共享1.4 进程和线程的关系 二、Linux线程控制2.1 POSIX线程库2.2 线程创建2.3 获取线程ID pthread_self2.4 线程等待pthread_join2.5 线程终止2.6 线程栈 && pthread_t2.7 线程的局…

多路转接Poll

在之前我们讲过select是最古老的多路转接方案&#xff0c;古老就意味着他不是很方便使用&#xff0c;他需要用户手动保存fd_set这个位图结构&#xff0c;来表示读写事件的关注与否或者就绪性。 而且由于fd_set的大小是固定的&#xff0c;这就意味着他能管理的套接字文件描述符是…

多层感知机的简洁实现

《动手学深度学习》-4.3-笔记 import torch from torch import nn from d2l import torch as d2l 导入必要的库和模块 net nn.Sequential(nn.Flatten(),nn.Linear(784, 256),nn.ReLU(),nn.Linear(256, 10))def init_weights(m):if type(m) nn.Linear:nn.init.normal_(m.we…

【GoLang】调用llm时提示词prompt的介绍以及使用方式

介绍 提示词是一种与大模型交互的对话格式&#xff0c;它以 JSON 格式定义了一个消息列表&#xff08;messages&#xff09;&#xff0c;包含了系统消息和用户消息。 我们向AI提问时&#xff0c;其实发给AI的都是提示词&#xff0c;别看我们只是简单输入了一句话&#xff0c;…

区间端点(java)(贪心问题————区间问题)

deepseek给了一种超级简单的做法 我是真的想不到 贪心的思路是 局部最优——>全局最优 这种我是真的没有想到&#xff0c;这样的好处就是后面便利的时候可以通过foreach循环直接便利qu的子元素也就是对应的某一个区间, 将一个二维数组变成一维数组&#xff0c;每一个一维…

Qt事件处理(处理鼠标事件、键盘事件、定时器事件、窗口移动和大小变化事件)

事件处理 事件是应用程序内部或者外部产生的事情或者动作的统称。 在 Qt 中&#xff0c;事件是用一个对象来管理一个事件的。所有的事件对象都继承自抽象类 QEvent 。事件包括鼠标事件、键盘事件等&#xff0c;发出自 Qt 或操作系统本身。 处理事件一般通过重写相关的 Event 函…

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统&#xff0c;支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…

cfca 申请国密证书流程

之前给某银行开发项目&#xff0c;需要用到cfca国密双证证书&#xff0c;证书类型为企业双证的作为接口加密的密钥。 因为是第一次对接&#xff0c;其中走了不少的弯路&#xff0c;现将申请的流程发布出来做下记录 1、需要找到cfca的相关人员进行测试证书的申请 2、大概1天的…

基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

数字孪生技术如何为制造业开辟新天地?

1. 数字孪生在制造业的崛起背景 1.1 数字孪生的概念演进 “数字孪生”(Digital Twin)一词最早由美国密歇根大学Michael Grieves博士在2002年提出,但当时并未称之为“数字孪生”,而是以“信息镜像模型”描述数字世界与物理世界的映射关系。直到2010年前后,美军、NASA等在…

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…

2024年MathorCup数学建模C题物流网络分拣中心货量预测及人员排班解题全过程文档加程序

2024年第十四届MathorCup高校数学建模挑战赛 C题 物流网络分拣中心货量预测及人员排班 原题再现&#xff1a; 电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包按照不同流…

鸿蒙Flutter开发故事:不,你不需要鸿蒙化

在华为牵头下&#xff0c;Flutter 鸿蒙化如火如荼进行&#xff0c;当第一次看到一份上百个插件的Excel 列表时&#xff0c;我也感到震惊&#xff0c;排名前 100 的插件赫然在列&#xff0c;这无疑是一次大规模的军团作战。 然后&#xff0c;参战团队鱼龙混杂&#xff0c;难免有…

Unity音频混合器如何暴露参数

音频混合器是Unity推荐管理音效混音的工具&#xff0c;那么如何使用代码对它进行管理呢&#xff1f; 首先我在AudioMixer的Master组中创建了BGM和SFX的分组&#xff0c;你也可以直接用Master没有问题。 这里我以BGM为例&#xff0c;如果要在代码中进行使用就需要将参数暴露出去…