我正在編寫一個合併了NHibernate的應用程序。NHibernate保存成千上萬的項目
加載時間和一切似乎都在我的初始配置的合理範圍內。但是,我正在嘗試爲應用程序的更多情況執行壓力測試。這個壓力測試大大增加了對象的數量,我現在可以節省3個等級:2400個交點,9600個區域和5000個車輛。
我遇到的問題是試圖首次將項目保存到數據庫。我創建的所有項目,然後嘗試通過拯救他們:
using (var tx = session.BeginTransaction())
{
foreach (Vehicle veh in Program.data.Vehicles.list)
{
session.Save(veh);
}
// Commit transactions
tx.Commit();
}
不過,我一直走過一條:
System.StackOverflowException了未處理 消息:類型系統的」未處理的異常。 StackOverflowException'發生在System.Data.dll中
我曾嘗試添加一個計數器,每循環2次循環調用Flush。問題在於車輛包含區域列表,區域包含車輛列表。恰巧每輛車都有一個每個區域的清單,反之亦然。所以召喚第一次會議.Save不僅拯救了第一輛汽車,而且還保存了每個區域,從而節省了所有車輛。
我在汽車的區域列表設置爲inverse = false;因此,如果它們不存在,它將保存車輛列表中的所有區域。
有什麼辦法可以告訴NHibernate經常提交更改,所以我沒有遇到StackOverflowException?我嘗試添加一個計數器來每10次刷新一次會話,但是在它達到此之前,我已經觸發了溢出異常。當它保存第一輛車時,它將節省每個區域。由於每個區域都包含每輛車,因此它將節省每輛車。在我發生溢出異常之前,我從來沒有遇到過沖洗。
我真的很希望能夠在車上打電話保存,並將保存到區域。當我保存車輛時,它將爲我節省大量的時間,從迭代通過兩個區域列表,然後再次潤飾區域。
任何想法?
編輯 這似乎是在tx.Commit()窒息。任何幫助解決這個問題將不勝感激。
編輯 按照問題發佈映射。我剪掉了一些過度的屬性和被映射的東西,並保留了主類的3個列表。
車輛和交點是從設備導出和被映射爲這樣:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class xmlns="urn:nhibernate-mapping-2.2" name="EMTRAC.Devices.Device, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Device`">
<joined-subclass name="EMTRAC.Intersections.Intersection, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<key>
<column name="Device_id" />
</key>
<component name="Zones" access="property">
<bag name="_list" cascade="all-delete-orphan" access="field" fetch="join" inverse="false">
<key>
<column name="Zone_PK" />
</key>
<many-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bag>
</component>
<property name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
</property>
</joined-subclass>
<joined-subclass name="EMTRAC.Vehicles.Vehicle, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<key>
<column name="Device_id" />
</key>
<component name="Zones" access="property">
<bag name="_list" cascade="save-update" access="field" table="VehicleZones" inverse="true">
<key>
<column name="veh_id" not-null="true"/>
</key>
<many-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bag>
</component>
<property name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
</property>
</joined-subclass>
</class>
</hibernate-mapping>
和區域映射如下:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class xmlns="urn:nhibernate-mapping-2.2" name="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Zone`">
<id name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="PK"/>
<generator class="identity" />
</id>
<version name="LastModifiedOn" column="LastModifiedOn" type="timestamp" access="field.pascalcase-underscore" />
<property name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
</property>
<component name="Vehicles" access="property">
<bag name="_list" cascade="save-update" access="field" table="VehicleZones">
<key>
<column name="veh_id" not-null="true"/>
</key>
<many-to-many class="EMTRAC.Vehicles.Vehicle, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bag>
</component>
</class>
</hibernate-mapping>
我逆設置爲true在車輛側,以便他們希望全部通過車輛映射,但不是100%確定是否映射正確。
每輛車都有一個每個區域的列表,反之亦然?這種關係的重點是什麼?這將是一個鏈接表(#vehicles * #zones)行。 – dotjoe
這被設計成壓力測試的方式。並非所有生產的車輛都必須擁有每個區域等。但車輛和區域的鏈接始終是雙向的。我只是用它作爲在更糟情況下強調的參考。我想看看NHibernate是否可以處理大量的對象集合。同時一次保存這些項目很少,如果以這種方式完成的話,但是如果需要出現或者使用NHibernate沒有意義,我必須使用它。 –
哦,我明白了,當然只有多對多的一方應該級聯?你能發佈映射嗎? – dotjoe