Marten中IDocumentStore.OpenSession()与LightweightSession()的区别
IDocumentStore.OpenSession()与IDocumentStore.LightweightSession()的核心差异 两种方法创建的都是符合Marten Unit of Work模式的操作会话,核心区别集中在内置变更跟踪的实现机制上,具体差异如下:
- 变更跟踪行为差异
OpenSession()是带完整会话级变更跟踪的重量级会话:会话内部会为所有加载过的实体存储原始状态快照,同时维护会话内的实体实例缓存(即身份映射表)。调用SaveChangesAsync()提交时,Marten会自动逐一对已加载实体做状态对比,仅对发生实际改动的实体生成对应的写入SQL,无需开发者手动将实体标记为待更新状态;同一会话中重复查询同一ID的实体时,会直接返回缓存的实例,不会重复发起数据库查询。LightweightSession()是完全无内置变更跟踪的轻量会话:会话既不会为加载的实体存储原始状态快照,也不维护实体实例缓存。如果需要将实体的修改持久化到数据库,必须显式调用Update()方法将实体加入待写入列表,否则即使手动修改了实体的属性值,调用SaveChangesAsync()时也不会生成任何对应的更新语句;同一会话中重复查询同一ID的实体时,会直接发起数据库查询并返回全新的实体实例,没有缓存复用的逻辑。
- 运行时开销差异
OpenSession()因为需要额外维护状态快照、实体映射表结构,相比LightweightSession()会产生更高的内存占用,当单次会话加载成百上千个实体时,内存差异会被明显放大;LightweightSession()跳过了所有变更检测、缓存维护的流程,整体执行链路更短、内存占用更低,在批量写入、高并发接口场景下的吞吐表现更优。 - 选型场景差异
OpenSession()适合业务逻辑复杂、会跨多段代码修改实体状态的交互场景,可以减少大量手动标记实体更新的冗余代码。LightweightSession()适合以只读查询为主的场景、批量简单写入场景、需要完全手动控制持久化逻辑的场景,可最大限度降低会话本身带来的性能开销。
补充说明:两种会话支持的核心文档操作(插入、删除、原生查询、LINQ查询)、事务提交的核心逻辑完全一致,不存在功能上的缺失,差异仅围绕变更跟踪机制展开。
内容的提问来源于stack exchange,提问作者behroozbc
相关产品推荐
相关产品推荐

