JasperFx/Marten 文档会话详解:从基础到高级用法
概述
在 JasperFx/Marten 项目中,文档会话(Document Session)是与 PostgreSQL 数据库交互的核心接口。理解不同类型的会话及其适用场景对于构建高效、可靠的应用程序至关重要。本文将深入解析 Marten 中的会话机制,帮助开发者根据具体需求选择合适的会话类型。
会话类型总览
Marten 提供了多种会话类型,主要分为两大类:
- 查询会话(QuerySession):专为只读操作优化
- 文档会话(IDocumentSession):支持读写操作,包含多种变体
会话类型对比表
| 创建方法 | 读写能力 | 身份映射 | 脏检查 | |---------|---------|---------|-------| | QuerySession() | 只读 | 否 | 否 | | LightweightSession() | 读写 | 否 | 否 | | IdentitySession() | 读写 | 是 | 是 | | DirtyTrackedSession() | 读写 | 是 | 是 | | OpenSession() | 读写 | 是 | 否 |
查询会话(QuerySession)
查询会话是执行只读操作的最佳选择,它轻量且高效。在 ASP.NET Core 中,可以通过依赖注入直接获取:
public class IssueController : ControllerBase
{
private readonly IQuerySession _session;
public IssueController(IQuerySession session)
{
_session = session;
}
[HttpGet("/issue/{issueId}")]
public Task<Issue> Get(Guid issueId)
{
return _session.LoadAsync<Issue>(issueId);
}
}
手动创建查询会话:
using var store = DocumentStore.For(opts =>
{
opts.Connection("your_connection_string");
});
await using var session = store.QuerySession();
var issues = await session.Query<Issue>()
.Where(x => x.Tags.Contains("open"))
.ToListAsync();
文档会话(IDocumentSession)
1. 轻量级会话(LightweightSession)
推荐用于大多数读写场景,性能最佳:
await using var session = store.LightweightSession();
var user = new User { Name = "John" };
session.Store(user);
await session.SaveChangesAsync();
2. 身份映射会话(IdentitySession)
实现了身份映射模式,确保同一文档在会话中只加载一次:
using var session = store.IdentitySession();
var user1 = await session.LoadAsync<User>(userId);
var user2 = await session.LoadAsync<User>(userId);
// user1 和 user2 是同一个对象引用
3. 脏检查会话(DirtyTrackedSession)
自动检测文档变更,适合复杂对象图:
using var session = store.DirtyTrackedSession();
var user = await session.LoadAsync<User>(userId);
user.Name = "Modified";
await session.SaveChangesAsync(); // 自动检测到变更
高级功能
序列化事务会话
对于需要可序列化事务隔离级别的场景:
await using var session =
await store.LightweightSerializableSessionAsync();
// 执行事务操作...
从会话中移除文档
using var session = store.IdentitySession();
var user = await session.LoadAsync<User>(userId);
session.Eject(user); // 从身份映射中移除
连接管理
Marten 7+ 默认按需打开和关闭连接,提高并发性能。可以通过配置恢复旧版"粘性"连接行为:
var store = DocumentStore.For(opts =>
{
opts.Connection("your_connection_string");
opts.UseStickyConnectionLifetimes = true;
});
显式事务控制
await using var session = store.LightweightSession();
await session.BeginTransactionAsync();
// 执行操作...
await session.CommitAsync();
命令超时设置
using var session = store.LightweightSession(
new SessionOptions { Timeout = 60 }); // 60秒超时
最佳实践建议
- 读操作:优先使用
QuerySession
- 简单写操作:使用
LightweightSession
- 复杂领域模型:考虑
DirtyTrackedSession
- Web请求:适合使用身份映射会话
- 批量操作:注意会话生命周期,及时释放资源
通过合理选择会话类型和配置,可以显著提升应用性能和资源利用率。Marten 灵活的会话机制为不同场景提供了优化空间,开发者应根据具体需求做出选择。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考