2012-05-22 25 views
2

我有一个有3个状态的传奇 -如何确保与MassTransit佐贺,增加了一个项目,以良好的性能NHibernate的持久化的IList

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

它从初始转换到ReceivingRows当它到达一个BofMessage(其中Bof =文件开始)。在BofMessage之后,它接收大量的RowMessages,每个RowMessage描述一个平面文件中的一行。一旦发送了所有RowMessages,就会发送一个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)从重新插入到数据库中的数据库

C)中删除的数据库

B)中选择。

这似乎是非常不好的行为给我。只需要添加一行就可以......将一行添加到数据库中!字面上,添加操作是我使用行列表进行的唯一操作。当我们在列表中有10,000个项目时,这不会缩放。

有谁知道如何给这个传奇更理智的表现行为?

BTW - 这里的IList的是如何映射,如果你需要它 -

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

谢谢!

回答

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()); 

的类型为RowsIList<Row>

相关问题