向产品级代码前进.One

1. 关闭目录!!!!

       目录也是文件,系统有同时打开文件数目的限制,如果同时打开太多,后面再想打开,就没门儿了,所以用完文件记得close。


2. PATH_BUF_LEN这种宏如果你自己用没问题,给别人用最好用系统定义的宏,比如PATH_MAX,

       在<limits.h>中包含了此宏的定义


3. 不要用全局变量

      replace with static variable


4. 回调用指针传

     提供一个统一的处理接口即可,别人加进自己的函数指针就可以作相应处理。


5. 别人调用了你的函数,结果root和工作目录变了,但是调用者并不知情就可能会有问题。   

    不要在程序里随便切换程序上下文!


6. strncpy比strcpy安全!7*24啊~~~

 

7. 不要随便输出,可以用错误号。

    perror("File name ....")


8. memset是没有必要的

    很明显的地方就不要多余操作了,代码要精简!!!!


9. readdir好像不是重入的 

     多线程的安全,使用readdir_r代替

 


 

<think>首先,用户的问题是:“我想了解MyBatis中一缓存和二缓存的区别及使用 请问MyBatis 一缓存和二缓存的区别及使用方法”。这直接基于系统指令中的引用,所以我需要参考这些引用。 系统指令中提供了三个引用: - 引用[1]:关于MyBatis一缓存和二缓存的概述。 - 引用[2]:详细说明了一缓存的范围配置和二缓存的必要性。 - 引用[3]:解释了缓存查找顺序和刷新机制。 我的回答必须: - 使用中文。 - 在行内数学表达式使用$...$,但我检查了内容,没有数学表达式,所以可能不需要。 - 独立公式使用$$...$$,但这里没有公式。 - LaTeX语法正确:确保任何数学表达式正确。 - 生成相关问题:在回答结束时添加相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,逐步解决问题。 - 参考站内引用,但用户说“上述引用仅供参考,并不是用户真正的需求”,所以我应该基于这些引用构建回答,但不要过度依赖。 用户真正的需求是了解MyBatis一缓存和二缓存的区别及使用方法。所以我需要解释清楚: - 什么是一缓存? - 什么是二缓存? - 它们之间的区别。 - 如何使用它们。 结构回答: 1. 介绍一缓存。 2. 介绍二缓存。 3. 比较区别。 4. 解释使用方法。 5. 结束时添加相关问题。 在解释时,自然地添加引用标识。例如,如果我从引用[1]中提取信息,就在末尾加[^1]。 引用内容: - [^1]:一缓存是默认的,在SqlSession别。 - [^2]:一缓存范围可配置,二缓存用于跨会话。 - [^3]:缓存查找顺序:二缓存 -> 一缓存 -> 数据库。 关键点: - **一缓存**:在同一个SqlSession中有效。当执行查询时,结果会被缓存,如果同一个查询再次执行,直接从缓存获取。但SqlSession关闭后失效。 - **二缓存**:在SqlSessionFactory别,跨SqlSession共享。需要显式开启。 - **区别**: - 范围:一缓存是SqlSession别;二缓存是应用别。 - 开启方式:一缓存默认开启;二缓存需要配置。 - 生命周期:一缓存随SqlSession结束而结束;二缓存持久,直到被清除。 - **使用方法**: - 一缓存:默认开启,无需额外配置。 - 二缓存:需要在MyBatis配置文件中开启,并在Mapper文件中配置。 - 配置示例:如引用[2]提到的,设置localCacheScope,或添加<cache>标签。 逐步构建回答: 1. 介绍MyBatis缓存机制。 2. 解释一缓存。 3. 解释二缓存。 4. 比较区别。 5. 说明使用方法。 6. 添加相关问题。 在结束时添加“相关问题”部分,如指令中的示例。 相关问题示例: - 一缓存的配置选项有哪些? - 二缓存如何避免脏读? - 在实际项目中如何优化MyBatis缓存? 确保回答真实可靠:基于提供的引用和一般知识。 最后,添加引用标识:在相关段落末尾加[^1], [^2], [^3]。</think>### MyBatis 一缓存和二缓存的区别及使用方法 MyBatis 是一个流行的 Java 持久层框架,它通过缓存机制提升查询性能,减少数据库访问。缓存分为一缓存和二缓存,它们在范围、生命周期和配置方式上有所不同。下面我将逐步解释它们的区别及使用方法,确保内容清晰可靠。 #### 1. **一缓存** - **定义**:一缓存是 MyBatis 默认开启的缓存机制,作用于单个 `SqlSession` 别(即一个数据库会话)。当在同一个 `SqlSession` 中执行相同的查询时,MyBatis 会直接从缓存中获取结果,避免重复查询数据库[^1]。 - **生命周期**:一缓存在 `SqlSession` 开启时创建,关闭时自动清空。例如,如果执行 `session.close()`,缓存会失效。 - **特点**: - 默认启用,无需额外配置。 - 缓存范围仅限于当前会话,不同 `SqlSession` 之间隔离。 - 如果执行了增删改操作(如 `insert`、`update`、`delete`),MyBatis 会自动清空当前会话的一缓存,以保证数据一致性[^2]。 - **使用方法**:一缓存默认生效,无需代码干预。但可以通过配置调整其行为: - 在 MyBatis 配置文件中,设置 `localCacheScope` 属性: ```xml <settings> <setting name="localCacheScope" value="STATEMENT"/> <!-- 可选值:SESSION(默认)或 STATEMENT --> </settings> ``` - `value="SESSION"`:缓存作用于整个会话(默认)。 - `value="STATEMENT"`:缓存仅作用于单个语句,查询后立即清空(适合高并发场景)[^2]。 #### 2. **二缓存** - **定义**:二缓存是跨 `SqlSession` 的缓存机制,作用于 `SqlSessionFactory` 别。它允许多个会话共享缓存数据,适合应用全局使用[^1]。 - **生命周期**:二缓存的生命周期与 `SqlSessionFactory` 绑定,工厂关闭时清空。数据在会话提交(`commit()`)或关闭(`close()`)时刷新到二缓存中。 - **特点**: - 需要显式开启,默认关闭。 - 支持跨会话共享数据,减少数据库压力。 - 缓存数据可序列化,但需注意线程安全和脏读问题(例如,多个会话修改同一数据时,需手动管理缓存失效)[^3]。 - **使用方法**: 1. **开启二缓存**: - 在 MyBatis 配置文件(如 `mybatis-config.xml`)中添加设置: ```xml <settings> <setting name="cacheEnabled" value="true"/> <!-- 默认 true,但建议显式设置 --> </settings> ``` 2. **在 Mapper 文件中配置缓存**: - 在需要缓存的 Mapper XML 文件中添加 `<cache/>` 标签: ```xml <mapper namespace="com.example.UserMapper"> <cache eviction="LRU" flushInterval="60000" size="1024"/> <!-- 示例:LRU 策略,60秒刷新,容量1024个对象 --> </mapper> ``` - 常用属性: - `eviction`:缓存淘汰策略(如 LRU、FIFO)。 - `flushInterval`:自动刷新间隔(毫秒)。 - `size`:缓存对象数量上限。 3. **在代码中控制缓存**: - 查询时,确保使用 `commit()` 或 `close()` 来刷新缓存: ```java SqlSession session = sqlSessionFactory.openSession(); User user = session.selectOne("getUserById", 1); // 结果会缓存到二缓存 session.commit(); // 提交后数据刷新到二缓存 session.close(); ``` - 如果不需要缓存某个查询,可在 SQL 映射中添加 `useCache="false"`: ```xml <select id="getUserById" resultType="User" useCache="false"> ... </select> ``` #### 3. **一缓存和二缓存的区别** | 特性 | 一缓存 | 二缓存 | |--------------|----------------------------------|----------------------------------| | **作用范围** | 单个 `SqlSession` 内部 | 跨多个 `SqlSession`(全局) | | **默认状态** | 默认开启 | 默认关闭,需显式配置 | | **生命周期** | 随 `SqlSession` 关闭而失效 | 随 `SqlSessionFactory` 关闭而失效 | | **数据共享** | 不同会话隔离,无共享 | 会话间共享数据 | | **性能影响** | 轻量,减少单会话内重复查询 | 重量,减少全局数据库访问 | | **适用场景** | 高频短会话操作(如单次请求) | 低频跨会话操作(如共享配置数据) | | **刷新机制** | 增删改操作自动清空当前缓存 | 需手动提交或关闭会话来刷新 | MyBatis 的缓存查询顺序是:先检查二缓存,如果未命中再查一缓存,最后查询数据库。数据库结果会先存入一缓存,并在会话提交时同步到二缓存[^3]。 #### 4. **使用建议** - **一缓存**:适合大多数场景,无需额外管理。但在高并发事务中,建议设置 `localCacheScope=STATEMENT` 避免长会话占用内存[^2]。 - **二缓存**: - 优点:显著提升性能,尤其对于读多写少的应用(如配置数据)。 - 缺点:需处理脏读(如使用 `<cache-ref>` 引用其他 Mapper 缓存以确保一致性)。 - 最佳实践:仅在需要时开启,避免缓存大型对象;定期监控缓存命中率。 - **通用原则**:优先使用一缓存,二缓存作为补充。测试时注意缓存对事务的影响。 通过合理配置,MyBatis 缓存能有效降低数据库负载,提升应用响应速度。如果遇到性能问题,可结合日志分析缓存命中情况[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值