nhibernate - 如何确保使用 MassTransit Saga 将项目添加到 NHibernate 持久化 IList 的良好性能

标签 nhibernate fluent-nhibernate masstransit saga

我有一个有 3 个状态的传奇 -

    public static State Initial { get; set; }
    public static State ReceivingRows { get; set; }
    public static State Completed { get; set; }

当它收到 BofMessage(其中 Bof = 文件开头)时,它会从 Initial 转换到 ReceivingRows。在 BofMessage 之后,它会收到大量 RowMessage,其中每个 RowMessage 都描述平面文件中的一行。发送所有 RowMessage 后,将发送 EofMessage 并且状态更改为 Completed。观察-

static void DefineSagaBehavior()
{
    Initially(When(ReceivedBof)
        .Then((saga, message) => saga.BeginFile(message))
        .TransitionTo(ReceivingRows));

    During(ReceivingRows, When(ReceivedRow)
        .Then((saga, message) => saga.AddRow(message)));

    During(ReceivingRows, When(ReceivedRowError)
        .Then((saga, message) => saga.RowError(message)));

    During(ReceivingRows, When(ReceivedEof)
        .Then((saga, message) => saga.EndFile(message))
        .TransitionTo(Completed));
}

public override void OnAddRow(ParcelRowMessage message)
{
    // ensure isCauvReturned is "Y"
    var fields = message.Value;
    var isCauvReturned = fields[33] == "Y";
    if (!isCauvReturned)
        return;

    // add row with just parcel number
    var parcelNumber = fields[1];
    var row = parcelNumber;
    _rows.Add(row);
}

除了具有 n 平方性能之外,它还有效。通过 NProf 进行调查表明,添加的每一行都会导致整个列表行变为:

A) 从数据库中选择

B) 从数据库中删除

C) 重新插入数据库。

这对我来说似乎是非常糟糕的行为。添加一行所需要做的就是……向数据库添加一行!从字面上看,添加操作是我对行列表所做的唯一操作。当列表中有 10,000 个项目时,这不会扩展。

有人知道如何让这个传奇更理智的表现行为吗?

顺便说一句 - 如果您需要的话,这是 IList 的映射方式 -

        HasMany(x => x.Rows)
            .Table("OwnerHistorySagaRow")
            .KeyColumn("CorrelationId")
            .Element("Row")
            .Cascade.AllDeleteOrphan();

谢谢!

最佳答案

我知道这是一个死项目,但这是让包正常工作的真正答案。

Bag(x => x.Rows, c =>
{
    c.Key(k =>
    {
        k.Column("RowCorrelationId");
        k.ForeignKey("FK_State_Row");
        k.NotNullable(true);
    });
    c.Fetch(CollectionFetchMode.Join);
    c.Lazy(CollectionLazy.NoLazy);
    c.Cascade(Cascade.All);
}, r => r.OneToMany());

Rows 的类类型是 IList<Row> .

关于nhibernate - 如何确保使用 MassTransit Saga 将项目添加到 NHibernate 持久化 IList 的良好性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708451/

相关文章:

c# - MassTransit:将 header 添加到发布管道

masstransit - MassTransit 创建的 RabbitMQ 拓扑

rabbitmq - 公共(public)交通 : ensure message processing order when there are different message types

c# - NHibernate SQL 创建导致错误

wpf - Fluent 约定会破坏延迟加载吗? (uNhAddIns)

nhibernate - 有没有关于 NHibernate 与 Fluent NHibernate 启动性能的数据?

asp.net-mvc - Fluent NHibernate 和存储库模式

c# - 在同一张表上映射多对多关系

NHibernate Criteria.AddOrder(Order.Asc ("Column.Property"))

fluent-nhibernate - Fluent NHibernate AutoMapping 在尝试提交 List<> 时抛出 "StaleStateException"