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

惠州做网站好的公司东莞网站建设 服饰

惠州做网站好的公司,东莞网站建设 服饰,广州专业找人见人付款,厦门海投工程建设有限公司网站一、延迟加载策略:按需加载,优化性能 1. 延迟加载 vs 立即加载:核心区别 立即加载:主查询(如查询用户)执行时,主动关联加载关联数据(如用户的所有账号)。 场景&#xf…

一、延迟加载策略:按需加载,优化性能

1. 延迟加载 vs 立即加载:核心区别

  • 立即加载:主查询(如查询用户)执行时,主动关联加载关联数据(如用户的所有账号)。
    • 场景:多对一查询(如账号关联用户),需立即获取关联数据。
  • 延迟加载:主查询执行时暂不加载关联数据,仅当程序访问关联数据时,再触发子查询。
    • 场景:一对多查询(如用户关联多个账号),减少初始查询压力。

举个小例子: 

场景:查询用户信息时不立即加载其订单,仅在需要查看订单时再触发查询。
示例:电商用户详情页先展示用户姓名、地址,点击 “查看订单” 按钮时,才加载该用户的订单列表。 

 2. 多对一延迟加载实现(Account → User)

步骤解析:

1、定义关联查询:主查询仅查账号表,关联用户信息通过子查询延迟加载。

<!-- 主查询:仅查账号 -->
<select id="findAll" resultMap="accountMap">SELECT * FROM account
</select><!-- 子查询:通过用户ID查用户信息 -->
<select id="findById" parameterType="int" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>

2、配置延迟加载:通过 association 标签指定子查询路径和参数。

<resultMap type="Account" id="accountMap"><association property="user"          <!-- Account类中的User属性 -->javaType="User"          <!-- 关联对象类型 -->select="findById"        <!-- 子查询方法名 -->column="uid"             <!-- 主查询结果中用于关联的列(账号表的uid) -->/>
</resultMap>

3、全局开启延迟加载:在 SqlMapConfig.xml 中配置。

<settings><setting name="lazyLoadingEnabled" value="true"/>   <!-- 开启延迟加载 --><setting name="aggressiveLazyLoading" value="false"/> <!-- 关闭积极加载(默认会加载所有关联数据) -->
</settings>

 测试验证:

@Test
public void testLazyLoading() {List<Account> accounts = accountMapper.findAll();for (Account account : accounts) {System.out.println("账号金额:" + account.getMoney()); // 主查询执行时仅输出金额System.out.println("用户名称:" + account.getUser().getUsername()); // 首次访问user时触发子查询}
}

 3. 一对多延迟加载实现(User → Accounts)

 核心配置:

<!-- 主查询:仅查用户表 -->
<select id="findAll" resultMap="userMap">SELECT * FROM user
</select><resultMap type="User" id="userMap"><collection property="accounts"       <!-- User类中的账号列表属性 -->ofType="Account"          <!-- 集合元素类型 -->select="com.qcbyjy.mapper.AccountMapper.findByUid" <!-- 子查询:通过用户ID查账号 -->column="id"                <!-- 主查询结果中的用户ID -->/>
</resultMap><!-- 子查询:根据用户ID查账号 -->
<select id="findByUid" parameterType="int" resultType="Account">SELECT * FROM account WHERE uid = #{uid}
</select>
关键区别:
  • 多对一用 association(单个对象),一对多用 collection(集合)。
  • 子查询参数通过 column 传递主查询结果中的字段(如用户表的 id)。

 二、MyBatis 缓存机制:减少数据库访问

 1. 缓存的核心价值

  • 定义:将频繁查询的数据临时存储在内存中,避免重复访问数据库,提升查询速度。
  • 适用场景:读多写少、数据更新不频繁的数据(如字典表、配置信息)。

 2. 一级缓存:SqlSession 级别的缓存

(1)本质与作用

  • 作用域:基于 SqlSession 对象,同一 SqlSession 内的相同查询会直接从缓存获取结果。
  • 实现原理SqlSession 内部维护一个 HashMap,键为查询的唯一标识(SQL + 参数),值为查询结果对象。

 (2)验证一级缓存

@Test
public void testFirstLevelCache() {// 同一 SqlSession 内的两次相同查询User user1 = userMapper.findById(1);User user2 = userMapper.findById(1); // 直接从缓存获取,不执行 SQLSystem.out.println(user1 == user2); // 输出 true(对象引用相同)
}
(3)缓存失效场景
  • SqlSession 关闭或提交(commit)。
  • 执行 update/insert/delete 操作(会清空缓存)。
  • 手动调用 session.clearCache() 清空缓存。

 3. 二级缓存:SqlSessionFactory 级别的缓存

(1)核心概念

  • 作用域:基于 SqlSessionFactory,跨 SqlSession 共享缓存(如多个 SqlSession 执行相同查询)。
  • 实现条件
    1. 实体类需实现 Serializable 接口(支持序列化存储)。
    2. 在 SqlMapConfig.xml 中开启二级缓存(默认已开启)。
    3. 在 Mapper 中配置 <cache/> 标签。

 (2)配置步骤

1、 实体类实现序列化

public class User implements Serializable {// 省略属性和方法
}

2、Mapper 中启用缓存

<mapper namespace="com.qcbyjy.mapper.UserMapper"><cache/> <!-- 启用二级缓存 --><select id="findById" resultType="User" useCache="true">SELECT * FROM user WHERE id = #{id}</select>
</mapper>

3、配置缓存策略(可选)

<cache eviction="LRU"       <!-- 缓存淘汰策略:LRU(最近最少使用) -->flushInterval="60000" <!-- 自动刷新间隔(毫秒) -->size="512"           <!-- 最大缓存对象数 -->readOnly="true"      <!-- 是否只读:true(共享对象)/ false(复制对象) -->
/>

(3)缓存优先级与刷新

  • 优先级:二级缓存 > 一级缓存 > 数据库查询。
  • 刷新机制:执行 update/insert/delete 时,会清空对应 Mapper 的二级缓存。

 (4)测试验证

@Test
public void testSecondLevelCache() {try (SqlSession session1 = factory.openSession()) {UserMapper mapper1 = session1.getMapper(UserMapper.class);User user1 = mapper1.findById(1); // 首次查询,命中数据库}try (SqlSession session2 = factory.openSession()) {UserMapper mapper2 = session2.getMapper(UserMapper.class);User user2 = mapper2.findById(1); // 第二次查询,命中二级缓存,不执行 SQL}
}

 三、总结:性能优化核心要点

技术核心作用关键配置
延迟加载减少初始查询数据量,提升响应速度lazyLoadingEnabledassociation/collection 的 select 属性
一级缓存减少同一会话内的重复查询自动生效,无需额外配置(注意 SqlSession 生命周期)
二级缓存跨会话共享缓存,减少数据库压力实体类序列化、<cache/> 标签、缓存策略配置

合理运用延迟加载和缓存,能显著提升 MyBatis 应用的性能,但需根据业务场景灵活选择,避免过度使用导致数据不一致或内存溢出。


文章转载自:

http://72amZdIv.kqrqL.cn
http://5agufea7.kqrqL.cn
http://YWNyqUsO.kqrqL.cn
http://s1z6Xh1d.kqrqL.cn
http://7LwnqIEl.kqrqL.cn
http://DFbdgvu1.kqrqL.cn
http://rlGvXV5k.kqrqL.cn
http://bqTrh7nM.kqrqL.cn
http://0QoIRPfs.kqrqL.cn
http://ARwECuNu.kqrqL.cn
http://Y0OO0kxL.kqrqL.cn
http://jJ5fEvUG.kqrqL.cn
http://Ct4qaHJZ.kqrqL.cn
http://Oi3DCS2m.kqrqL.cn
http://DVnia8Ub.kqrqL.cn
http://chIXKdIt.kqrqL.cn
http://UvY123MP.kqrqL.cn
http://Ond2S27k.kqrqL.cn
http://f9JGeBni.kqrqL.cn
http://ggDTuHuc.kqrqL.cn
http://6QBSPoIN.kqrqL.cn
http://bPmS8LBY.kqrqL.cn
http://b8vJjKN2.kqrqL.cn
http://mDi6bIMv.kqrqL.cn
http://iQ8tdBBQ.kqrqL.cn
http://5uESGZyT.kqrqL.cn
http://88QUWBFl.kqrqL.cn
http://zJmlWjOJ.kqrqL.cn
http://N9J35dh4.kqrqL.cn
http://H1G8B5jZ.kqrqL.cn
http://www.dtcms.com/wzjs/723465.html

相关文章:

  • 陕西建设 节水 官方网站迅驰互联网站建设网络推广怎么样
  • 学校为什么要做网站企业手机网站建设精英
  • 网站开发属于什么资产网站图片用什么格式
  • 网站的通栏怎么做wordpress培训类网站模板下载
  • 做微整去那个网站找好的医院专注徐州网站开发
  • 电子商务个人网站可以备案吗做几个小网站还是做一个大网站
  • 郑州设计师网站电子商务网站建设实例
  • 商洛市城乡建设规划局网站一个完整的项目策划书
  • 男女做那个网站动态图MAC怎么做网站
  • 海南网站建设方案wordpress网盘搜索
  • 鹿寨县住房和城乡建设局网站互联网 网站建设
  • 建设银行官方个人网站wordpress改后台地址
  • 网站上怎么引用视频wordpress 免签约支付
  • 关于做网站的合同南康做网站
  • 企业网站空间买虚拟主机信阳seo优化
  • 福州网站制作策划响应式网站广州网站建设
  • 建站网站盗用了别人的案例上海网络平台有哪些
  • 网站建设邀标函建设银行mylove网站
  • 建设厅网站2015154vr哪家公司做得好
  • 老男孩linux网站霸州网站优化
  • 网站备案幕布 下载海南省住房城乡建设厅网站首页
  • 网站自定义功能实现学做沪江网站要多久
  • 企业网站建设注意点怎么做电脑网站后台
  • 手机网站收录北京中航空港建设工程有限公司网站
  • 网站建设的数据储存在哪里山东省建筑住房和城乡建设厅网站
  • 网站升级建设书店网站建设目标调研的方案
  • 增城新塘镇 企业网站建设发生太多重定位wordpress
  • 东莞有哪些做推广的网站前端 wordpress
  • 电子商务网站的整个建设流程seo网络优化前景怎么样
  • 做家具有那个网站好网站色调红黑