如何使用MassTransit Saga确保良好的性能,将物品添加到NHibernate持久的IList

时间:2012-05-22 19:07:10

标签: 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之后,它接收大量的RowMessages,其中每个RowMessages描述一个平面文件中的一行。发送完所有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平方的性能之外,这是有效的。使用NHProf进行调查显示,每行添加都会导致行的整个列表

A)从数据库中选择

B)从数据库中删除

C)重新插入数据库。

这对我来说似乎是非常糟糕的行为。添加行所需的只是......好吧,向数据库添加一行!添加操作实际上是我在行列表中唯一做的事情。当我们在列表中有10,000个项目时,这不会扩展。

有谁知道如何让这个传奇更健全的表现行为?

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

我知道这是一个死机,但这是让行李正常工作的真正答案。

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>

答案 1 :(得分:1)