【高并发系统设计必备】:MyBatis延迟加载触发原理与最佳实践

第一章:MyBatis延迟加载机制概述

MyBatis 是一款优秀的持久层框架,其延迟加载(Lazy Loading)机制能够有效提升应用程序的性能。延迟加载的核心思想是:在关联对象真正被访问时才执行数据库查询,而非在主对象加载时立即加载所有关联数据。这一特性特别适用于存在一对一、一对多关系的复杂对象模型,避免不必要的 JOIN 查询和数据冗余。

延迟加载的工作原理

当启用延迟加载后,MyBatis 会为需要延迟加载的属性创建代理对象。这些代理对象在被访问前仅保存加载所需的信息(如 SQL 语句、参数等),直到调用其 getter 方法时才触发实际的数据库查询。

开启延迟加载的配置方式

在 MyBatis 的核心配置文件中,需显式开启延迟加载并关闭侵入式加载:
<settings>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="aggressiveLazyLoading" value="false"/>
</settings>
其中:
  • lazyLoadingEnabled:启用延迟加载全局开关
  • aggressiveLazyLoading:若设为 true,则访问任意方法都会触发全部延迟属性加载;设为 false 可实现按需加载

延迟加载的应用场景对比

场景立即加载延迟加载
用户信息 + 订单列表一次性加载所有订单仅当访问订单属性时查询
文章 + 作者详情每次查文章都查作者仅当获取作者信息时触发查询
通过合理使用延迟加载,可以显著减少数据库 I/O 操作,优化系统响应速度。但需注意避免“N+1 查询问题”,建议结合 association 与 collection 的 fetchType 属性进行细粒度控制。

第二章:延迟加载的触发条件与原理分析

2.1 延迟加载的核心触发条件解析

延迟加载(Lazy Loading)是一种按需加载资源的策略,其核心在于**首次访问代理对象时触发数据加载**。该机制广泛应用于ORM框架中,如Hibernate或Entity Framework。
触发条件分析
  • 访问代理对象的非标识符属性
  • 调用关联对象的getter方法
  • 未在初始化阶段显式加载关联数据
代码示例:Hibernate中的延迟加载

@Entity
@Proxy(lazy = true)
public class User {
    @Id private Long id;
    
    @OneToMany(fetch = FetchType.LAZY)
    private List orders;
}
上述配置中,FetchType.LAZY 表明 orders 集合仅在调用 getUser().getOrders() 时发起SQL查询,实现按需加载。
加载时机对比表
操作是否触发加载
获取ID否
调用getOrders()是

2.2 代理对象生成机制与调用链路剖析

在Spring AOP中,代理对象的生成是通过ProxyFactoryBean或自动代理创建器(如BeanNameAutoProxyCreator)完成的。核心机制依赖JDK动态代理或CGLIB字节码增强。
代理生成方式对比
  • JDK动态代理:基于接口生成代理类,要求目标类实现至少一个接口;
  • CGLIB代理:通过继承目标类生成子类,适用于无接口场景,但无法代理final方法。
调用链路分析
当方法被调用时,请求首先进入代理对象,触发MethodInterceptor的intercept()方法:
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    // 前置通知执行
    before.invoke();
    try {
        // 调用原始方法
        return proxy.invokeSuper(obj, args);
    } catch (Exception e) {
        // 异常通知处理
        afterThrowing.invoke();
        throw e;
    } finally {
        // 后置通知执行
        afterReturning.invoke();
    }
}
该拦截逻辑构建了完整的AOP调用链条,实现了横切关注点的织入。

2.3 关联映射中的懒加载行为差异(一对一 vs 一对多)

在ORM框架中,一对一与一对多关联的懒加载行为存在显著差异。一对一关系通常默认启用懒加载,仅在访问关联属性时触发查询;而一对多关系由于集合的潜在大小不确定,更易引发性能问题。
懒加载机制对比
  • 一对一:目标实体唯一,代理对象可精准延迟加载
  • 一对多:返回集合类型(如List),需谨慎处理初始化时机
代码示例

@Entity
public class User {
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "profile_id")
    private Profile profile; // 懒加载有效

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private List orders; // 集合懒加载
}
上述代码中,Profile在访问时才会查询,而orders列表虽标记为LAZY,但在某些场景下(如Session关闭后)易导致LazyInitializationException。

2.4 LazyLoadingEnabled配置项对触发行为的影响

在ORM框架中,LazyLoadingEnabled配置项直接影响实体关联数据的加载时机。当该选项启用时,导航属性仅在首次访问时触发数据库查询,有效减少初始数据加载量。
配置影响对比
配置状态加载行为性能影响
启用按需加载关联数据降低内存占用,增加查询次数
禁用一次性加载所有关联提高查询效率,增加初始负载
典型代码示例
optionsBuilder.UseLazyLoadingProxies();
// 需配合virtual导航属性使用
public class Order {
    public int Id { get; set; }
    public virtual Customer Customer { get; set; } // 延迟加载目标
}
上述代码中,仅当访问Order.Customer时才会执行关联查询。若未启用代理或未标记virtual,延迟加载将失效,可能导致意外的数据缺失或N+1查询问题。

2.5 从源码层面解读延迟加载的初始化时机

在延迟加载机制中,对象的初始化时机通常发生在首次访问其代理实例的方法调用时。以 Hibernate 的 `PersistentAttributeInterceptable` 为例,当实体字段被标记为 `fetch = FetchType.LAZY`,其实际加载逻辑由字节码增强生成的 `EnhancerByCGLIB` 动态代理类控制。
代理拦截触发点

public class LazyLoadingInterceptor implements MethodInterceptor {
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        if (!initialized) {
            session.initialize(this); // 触发数据库查询
            initialized = true;
        }
        return proxy.invokeSuper(obj, args);
    }
}
上述代码展示了方法拦截器的核心逻辑:仅当字段未初始化且发生方法调用时,才执行 `initialize()` 操作,完成数据加载。
初始化状态管理
延迟加载依赖于运行时上下文的状态跟踪,常见策略包括:
  • 使用 volatile 标志位记录初始化状态
  • 绑定当前线程的 Session 上下文进行生命周期管理
  • 通过脏检查机制避免重复加载

第三章:典型场景下的延迟加载实践

3.1 resultMap中association标签的延迟加载应用

在MyBatis中,``标签用于映射一对一关联关系。通过配置延迟加载(Lazy Loading),可以提升系统性能,避免不必要的关联查询。
启用延迟加载配置
需在mybatis-config.xml中开启延迟加载:
<settings>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="aggressiveLazyLoading" value="false"/>
</settings>
其中,lazyLoadingEnabled启用延迟加载,aggressiveLazyLoading设为false表示仅加载被调用的关联对象。
映射配置示例
<resultMap id="UserResult" type="User">
  <id property="id" column="user_id"/>
  <result property="name" column="user_name"/>
  <association property="account" 
               javaType="Account"
               select="selectAccountByUserId" 
               column="user_id"/>
</resultMap>
此处select指定延迟加载的SQL语句ID,column传递参数。只有在访问user.getAccount()时,才会触发selectAccountByUserId查询。

3.2 collection关联集合的懒加载实现策略

在ORM框架中,`collection`关联集合的懒加载能有效提升查询性能,避免不必要的数据加载。通过代理模式延迟初始化集合,仅在实际访问时触发数据库查询。
懒加载核心机制
使用动态代理创建集合的占位对象,拦截`iterator()`、`size()`等方法调用,触发SQL加载真实数据。
public class LazyCollectionProxy implements Collection<Item> {
    private boolean loaded = false;
    private List<Item> target;

    public Iterator<Item> iterator() {
        if (!loaded) load();
        return target.iterator();
    }

    private void load() {
        // 执行关联SQL查询
        this.target = session.select("SELECT * FROM item WHERE parent_id = ?", parentId);
        loaded = true;
    }
}
上述代码展示了代理类如何延迟加载关联数据:首次访问时才执行数据库查询,后续操作直接作用于已加载集合,减少内存开销与I/O等待。

3.3 多层级嵌套对象加载的性能影响与优化

嵌套对象加载的性能瓶颈
深度嵌套的对象结构在序列化与反序列化过程中会显著增加内存开销和CPU计算时间。特别是在ORM框架中,关联关系的级联加载(如一对多、多对多)容易引发“N+1查询”问题,导致数据库调用次数呈指数级增长。
典型场景示例

{
  "user": {
    "id": 1,
    "name": "Alice",
    "orders": [
      {
        "id": 101,
        "items": [
          { "product": "Book", "price": 25 },
          { "product": "Pen", "price": 5 }
        ]
      }
    ]
  }
}
上述JSON包含三层嵌套,解析时需递归构建对象树,深度越大,栈消耗越高。
优化策略
  • 延迟加载(Lazy Loading):仅在访问时加载子对象
  • 扁平化数据结构:通过JOIN将嵌套数据展平
  • 分页加载嵌套集合:限制每层返回数量
策略内存占用响应时间
全量加载高慢
延迟加载低快(首次)

第四章:常见问题排查与最佳实践

4.1 N+1查询问题识别与规避技巧

N+1查询问题是ORM框架中常见的性能瓶颈,表现为执行1次主查询后,对每个结果项又触发额外的关联查询,导致数据库请求激增。
典型场景示例
// GORM 示例:N+1 问题
var users []User
db.Find(&users)
for _, user := range users {
    fmt.Println(user.Profile.Name) // 每次访问触发一次 SELECT
}
上述代码先查询所有用户(1次),随后为每个用户的 Profile 属性发起单独查询(N次),形成 N+1 问题。
规避策略
  • 预加载(Preload):在初始查询时一次性加载关联数据
  • 联表查询(Joins):通过 SQL JOIN 减少查询次数
  • 批量查询:提取 ID 列表后批量获取关联数据
使用预加载优化后:
db.Preload("Profile").Find(&users) // 单次查询完成关联加载
该方式将 N+1 次查询缩减为 1 次,显著降低数据库负载并提升响应速度。

4.2 事务边界对延迟加载失败的影响分析

在使用ORM框架(如Hibernate)时,延迟加载依赖于持久化上下文的存活。当事务提前结束,会话关闭,代理对象无法再触发数据库查询,导致LazyInitializationException。
典型异常场景

@Transactional
public UserDTO getUserById(Long id) {
    User user = userRepository.findById(id);
    // 事务在此方法结束时提交并关闭会话
    return new UserDTO(user.getName(), user.getOrders()); // 访问延迟集合抛出异常
}
上述代码中,user.getOrders()触发延迟加载,但事务已提交,Session失效。
解决方案对比
方案优点缺点
Open Session in View避免懒加载异常延长数据库连接时间,影响性能
立即加载(Fetch Join)精准控制SQL,性能优可能加载冗余数据

4.3 禁用Javassist启用CGLIB代理的最佳配置方案

在Spring AOP中,CGLIB代理相比Javassist具有更高的性能和更广泛的兼容性。为确保应用使用CGLIB代理,需显式禁用Javassist并启用CGLIB。
配置方式
通过Spring Boot的配置文件或Java配置类进行设置:
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AopConfig {
    // proxyTargetClass = true 强制使用CGLIB代理
}
该配置强制Spring AOP使用CGLIB创建代理对象,适用于所有基于类的切面织入场景。
关键参数说明
  • proxyTargetClass = true:指示容器优先使用CGLIB代理而非JDK动态代理;
  • 需确保目标类非final且包含空构造函数,以满足CGLIB字节码生成要求;
  • 建议配合@ComponentScan与@Aspect注解实现自动切面注册。

4.4 结合二级缓存提升延迟加载效率的方法

在高并发场景下,频繁访问数据库会导致性能瓶颈。通过整合二级缓存(如Redis)与延迟加载机制,可显著降低数据库压力。
缓存代理策略
使用MyBatis等ORM框架时,启用二级缓存并配置缓存过期策略,使查询结果在事务外共享。当对象被延迟加载时,优先从缓存中获取关联数据。
<cache eviction="LRU" flushInterval="60000" size="512"/>
该配置定义了缓存使用LRU策略,每60秒刷新,最多缓存512个对象,有效控制内存占用。
数据同步机制
为避免脏读,需确保缓存与数据库一致性。可通过监听器在增删改操作后主动清除相关缓存条目。
  • 查询时优先读取缓存
  • 写操作后失效对应缓存
  • 设置合理TTL防止永久陈旧

第五章:总结与高并发系统设计启示

架构分层与职责分离
在高并发系统中,清晰的分层结构是稳定性的基石。典型的三层架构(接入层、服务层、数据层)应配合限流、降级和熔断机制使用。例如,在服务网关层使用 Nginx 或 Envoy 实现请求限流:

location /api/ {
    limit_req zone=api burst=10 nodelay;
    proxy_pass http://backend_service;
}
缓存策略的实际应用
合理利用多级缓存可显著降低数据库压力。某电商平台在“双11”期间采用 Redis + 本地缓存(Caffeine)组合,将商品详情页的响应时间从 80ms 降至 15ms。
  • 热点数据预加载至本地缓存,TTL 设置为 60 秒
  • Redis 作为二级缓存,设置 10 分钟过期时间
  • 通过 Kafka 异步更新缓存,避免缓存雪崩
异步化与消息队列解耦
订单创建场景中,同步调用库存、积分、通知服务会导致响应延迟。采用 RabbitMQ 进行异步处理后,核心链路 RT 下降 70%。
方案平均响应时间错误率
同步调用480ms2.3%
异步消息140ms0.5%
[用户请求] → API Gateway → Order Service → Kafka → [Inventory, Notification]
【Mybatis】延迟加载原理 延迟加载 延迟加载如何使用 Setting 参数配置 设置参数 描述 有效值 默认值 lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 true、false false aggressiveLazyLoading 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods). true、false false 阅读详情

相关推荐

Mybatis是否支持延迟加载?它的实现原理是什么?

MyBatis 的延迟加载是通过动态代理机制实现的,使用SqlSession在访问时进行后续的查询。配置时,需要启用,并可以通过和标签设置某个属性的延迟加载。延迟加载在提高性能的同时也要注意SqlSession的生命周期和事务管理,以确保懒加载能够正常工作。

些许风霜罢了 897

【Mybatis】延迟加载的原理是什么?

数据库访问在现代应用程序中扮演着至关重要的角色,而 MyBatis 作为一种优秀的持久层框架,为开发者提供了强大而灵活的工具。其中,延迟加载作为一项关键的特性,使得在处理复杂的关联关系时能够更加智能地加载数据,提高系统的性能和资源利用效率。本文将深入探讨 MyBatis 延迟加载的原理,以及如何巧妙地运用这一特性来优化数据库访问。MyBatis 的延迟加载为开发者提供了更为细粒度的数据加载控制,使得在数据库访问中能够更加灵活、高效。

AliceNo的博客 1764

机械臂TCP标定实战:从四点法到六点法的精度跃迁

本文详细解析机械臂TCP标定技术,从基础的四点法到高精度的六点法实现精度跃迁。通过工具坐标系与基坐标系的转换原理,结合实战案例展示六点法如何将装配合格率提升至99.5%,并分享环境控制、操作技巧等提升标定精度的关键要素。

weixin_29038345的博客 893

Mybatis延迟加载实现原理

MyBatis 通过动态代理机制实现了对关联关系和集合关系的延迟加载,帮助开发者在复杂的对象关系处理中提升性能。通过延迟加载,MyBatis 可以仅在需要时才执行数据库查询,避免不必要的数据加载,节省资源。然而,延迟加载并不是万能的,它也有可能带来性能上的隐患(如 N+1 查询问题)。因此,在实际应用中,开发者需要根据具体场景来合理配置 MyBatis 的延迟加载功能,以获得最佳的性能表现。

Flying_Fish_roe的博客 1123

别再硬编码了!WinCC子画面动态加载的5种C脚本写法对比

本文深入解析WinCC子画面动态加载的5种C脚本实现方案,包括基础加载、路径动态解析、多语言切换、窗口自适应布局和混合架构交互。通过代码示例和场景分析,帮助开发者避免硬编码问题,提升工业自动化系统的交互效率和可维护性。特别推荐路径动态解析方案,有效解决项目路径管理的痛点。

weixin_29008691的博客 475

材料仿真软件:Materials Studio_(14).电学性质计算

设置计算参数,包括 k 点网格、交换相关泛函等。

kkchenjj的博客 1863

Mybatis 延迟加载的实现原理

MyBatis 通过动态代理机制实现了灵活的延迟加载功能,为开发者提供了在复杂对象关系映射中优化数据库访问的手段。尽管延迟加载可以显著减少不必要的数据库查询,但也需要谨慎使用,避免潜在的性能问题。通过合理配置和良好的实践,MyBatis 的延迟加载可以在保持代码简洁性的同时,大幅度提升系统性能。

Flying_Fish_roe的博客 1202

UE5实现距离测量功能

UE5实现距离测量功能

专注GIS开发 6264

MyBatis延迟加载原理剖析

????MyBatis延迟加载原理剖析 1. 延迟加载的介绍及使用 本文将针对MyBatis提供的延迟加载(懒加载)原理剖析。 1.1 延迟加载是什么? 简单的来说延迟加载就是,在需要用到数据的时候进行加载,不需要用到数据就不进行加载。 假设数据库中涉及两张表,用户表AND订单表(一对多的关系),假设一个用户由很多订单,那么在查询用户的时候,需不需要当前用户关联的订单数据查询出来? 通常来说查询用户信息的时候,肯定是需要用到用户订单的时候在查询为好,尤其是一对多的多表查询,通常都建议采用延迟加载,因为单标查

WormholeStack 3053

把数据库算力拉满的 ABAP CDS Table Function:从语法、权限到可运行样例的全景解析

文章摘要: 本文针对ABAP开发者探讨了CDS Table Function的应用场景与实现细节。当CDS View无法处理复杂计算(如窗口函数、递归等)时,可通过Table Function将逻辑下推到HANA数据库执行。关键点包括:1)CDS实体声明与AMDP实现的协作关系;2)多租户环境下的Client处理机制(@ClientHandling.type注解);3)激活与传输的阶段性特点可能导致的"暂不可用"问题;4)基于SFLIGHT的完整示例,展示如何定义Client依赖函数、实

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 299

MIPI RFFE 信号完整性与硬件设计

MIPI RFFE信号完整性设计关键点 摘要:MIPI RFFE作为射频前端控制总线,其信号完整性设计需平衡速率、驱动能力与抗干扰性。核心挑战在于确保接收端在52Mb/s速率下保持足够的电压和时序裕量。关键设计考量包括: 驱动能力优化:过强导致过冲/振铃和射频杂散,过弱则恶化时序裕量,需与总线负载匹配。 波形质量指标:严格控制上升/下降时间(兼顾EMC和时序要求),抑制过冲/振铃幅度,管理VIO电源纹波和耦合噪声。

sinat_15150363的博客 237

深入理解MyBatis延迟加载:原理、配置与实战优化

MyBatis 的延迟加载(Lazy Loading)是一种优化技术,用于​​按需加载关联数据​​,避免一次性加载所有关联对象,从而减少数据库查询次数、提升应用性能。本文将从核心原理、实现方式、配置细节、注意事项及优化策略等方面展开详解。

weixin_42148384的博客 1733

机器学习实战5-天气预测系列:利用数据集可视化分析数据,并预测某个城市的天气情况

大家好,我是微学AI,最近天气真的是多变啊,忽冷忽热,今天再次给大家带来天气的话题,机器学习实战5-天气预测系列,我们将探讨一个城市的气象数据集,并利用机器学习来预测该城市的天气状况。该数据集包含年平均温度和湿度等信息。

微学AI的博客 1万+

Mybatis延迟加载

延迟加载(Lazy Loading)是一种设计模式,用于在应用程序运行过程中推迟对象的创建和数据的加载,直到需要使用它们时才进行加载。在MyBatis中,延迟加载机制可以有效提高性能,避免不必要的数据加载,尤其适用于涉及复杂数据关系的场景。当查询的对象包含延迟加载属性时,MyBatis会生成一个代理对象,并且代理对象在访问延迟加载的属性时才会触发实际的数据库查询。因此,在使用延迟加载时,需要根据具体的业务需求,权衡是否使用该功能,并结合性能优化手段进行合理配置。在MyBatis中,延迟加载通过。

weixin_64235858的博客 2011

智能能效管家:基于 ESP32 的智能插座设计与精细化功耗管理实现

针对传统插座无法远程控制、功耗监测缺失、能源浪费严重等问题,本文设计一款基于 ESP32 主控芯片的智能插座。该系统集成 WiFi 无线通信、交流功耗采集、继电器通断控制模块,实现四大核心功能。硬件采用模块化选型与安全接线设计,软件基于 Arduino-ESP32 框架开发,搭载 Mqtt 通信协议与功耗算法,可通过手机 / 云端实时管控设备,有效提升用电安全性与能源利用率。:ESP32;智能插座;功耗管理;远程控制;能耗监测。

weixin_42300449的博客 101

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MyBatis延迟加载及实现原理

延迟加载主要就是通过动态代理模式实现,通过代理拦截指定方法,从而现用现查,将结果设置到代理对象中返回,执行数据加载。

2301_76166241的博客 1698

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Mybatis延迟加载原理

摘要: MyBatis延迟加载通过动态代理(CGLIB/Javassist)实现按需查询,仅在访问关联属性时触发SQL,避免一次性加载嵌套数据。需配置lazyLoadingEnabled=true并关闭aggressiveLazyLoading,适用于多表关联或大数据量场景,但需注意Session生命周期和潜在N+1查询问题。核心原理是代理拦截方法调用,用运行时查询换取初始化性能优化。(149字) 关键词: MyBatis、延迟加载、动态代理、按需查询、性能优化

hhua0123的专栏 903

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java面试必备:MyBatis是否支持延迟加载?实现原理详解

MyBatis确实支持延迟加载(Lazy Loading),这是一种优化数据查询性能的重要技术。延迟加载的核心思想是:只有在真正需要使用关联对象的数据时,才执行关联查询,而不是在加载主对象时就立即加载所有关联对象。

qq_58299462的博客 940

深入理解 MyBatis 延迟加载机制与实现原理

登录后复制public class User implements Serializable { // 实现Serializable接口避免序列化问题// getter和setter方法// getter和setter方法1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.登录后复制// 使用Jackson注解忽略代理相关属性// 实体类定义1.2.3.4.5.

cnzzs的博客 1184

延迟加载触发不了?这4种MyBatis正确用法你必须掌握

解决MyBatis延迟加载不生效问题,掌握4种正确的触发方法。涵盖一对一、一对多关联查询场景,通过配置lazyLoadingEnabled、使用association与collection标签等实现高效数据加载。避免性能浪费,提升系统响应速度,值得收藏。

StepLens的博客 877

【MyBatis性能优化关键】:延迟加载的3大触发条件与避坑指南

掌握MyBatis延迟加载的触发方法,有效提升系统性能。本文详解关联查询、嵌套映射与配置启用三大触发条件,适用于复杂对象关系场景,减少冗余数据加载。避坑常见误区,优化SQL执行效率,值得收藏。

LiteCompile的博客 758

到底什么Mybatis的延迟加载,原理是什么?

假设,我们有两张表,分别是订单表和商品项表,一个订单中可以关联多个商品项。当我们从数据库中查询Order的时候,如果同时把关联的Item都返回,这就不是延迟加载,如果在后面真正用到Item的时候再调用加载,这就是延迟加载。延迟加载的主要原理是在当开启了延迟加载功能时,当查询主对象时,MyBatis会生成一个,并将代理对象返回给调用者。当后面需要访问这些关联对象时,代理对象会检查关联对象是否已加载。如果未加载,则触发额外的查询。

qq_38196449的博客 1147
上一篇: Java开发必知:HashSet add返回值的3个业务应用场景(90%项目都在用)
下一篇: 【Java JVM调优核心秘诀】:深入解析-XX:NewRatio参数对新生代内存分配的决定性影响
SimSolve
博客等级 码龄1年 152粉丝 2009原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值