JasperFx/Marten 文档会话详解:从基础到高级用法

JasperFx/Marten 文档会话详解:从基础到高级用法

marten .NET Transactional Document DB and Event Store on PostgreSQL marten 项目地址: https://gitcode.com/gh_mirrors/ma/marten

概述

在 JasperFx/Marten 项目中,文档会话(Document Session)是与 PostgreSQL 数据库交互的核心接口。理解不同类型的会话及其适用场景对于构建高效、可靠的应用程序至关重要。本文将深入解析 Marten 中的会话机制,帮助开发者根据具体需求选择合适的会话类型。

会话类型总览

Marten 提供了多种会话类型,主要分为两大类:

  1. 查询会话(QuerySession):专为只读操作优化
  2. 文档会话(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秒超时

最佳实践建议

  1. 读操作:优先使用 QuerySession
  2. 简单写操作:使用 LightweightSession
  3. 复杂领域模型:考虑 DirtyTrackedSession
  4. Web请求:适合使用身份映射会话
  5. 批量操作:注意会话生命周期,及时释放资源

通过合理选择会话类型和配置,可以显著提升应用性能和资源利用率。Marten 灵活的会话机制为不同场景提供了优化空间,开发者应根据具体需求做出选择。

marten .NET Transactional Document DB and Event Store on PostgreSQL marten 项目地址: https://gitcode.com/gh_mirrors/ma/marten

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸莹子Shelley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值