2

クラス内で多対多のコレクションがマッピングされた 2 つのクラスがあります。

これは、私の2つのクラスの単純化されたマッピングです。

車両:

<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`">
    <id name="PK" type="System.Int64, 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" />
    <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>     
  </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>

私のプログラムには、システムのストレス テスト用に 9600 のゾーンと 5000 の車両があります。現在、各ゾーンは各ビークルにマッピングされており、その逆も同様で、現実世界の「最悪のケース」のシナリオを模倣しています。

このストレス テスト データをデータベースに保存する必要があります。これらの 2 つのリストをマップするテーブルには、実行時までに 4,800 万行が含まれるため、いくつかの問題が発生しています。現実の世界では、すべてのアイテムを一度に保存する可能性は非常に低くなりますが、それでも発生します。したがって、これだけの数のアイテムをいつでも確実に保存できるようにする必要がありますが、これにはかなりの時間がかかることがわかっています。

バッチ処理にはステートレス セッションが推奨されることを知っています。ただし、ステートレス セッションはカスケード更新、継承、およびコレクションを完全に無視することを読みました。コミット呼び出し中にスタック オーバーフロー例外を受け取るため、ステートレス セッションでアイテムを保存することは現在不可能です。

私の質問はこれです。最初にすべてのゾーンと車両を保存すると、オブジェクトがデータベースに保持されます。ステートレス セッションを介してリストを保存することは可能ですか? そうでない場合、他の推奨事項はありますか?StatelessSession を使用して試したすべての結果、コレクション例外の永続化は発生しませんでした。

EDIT 通常のセッションを使用して、これらのオブジェクトの保存をトレースしてきました。保存を別のセッションとトランザクションで 100 回ごとに保存すると、Vehicle で SaveOrUpdate を呼び出すたびにゾーンの他のすべてのプロパティが保存されます。

リストのみを保存し、Vehicle または Zone オブジェクト自体に触れないようにする方法はありますか? それは、この最後の部分を機能させるために必要なもののようです。

4

1 に答える 1

1

ステートレス セッションはカスケードしないため、エンティティが既に挿入されている場合でも、コレクションを保存できません。セッションに頼る必要があります。私は Etl ジョブでよく使用し、多数のエンティティを処理するときに呼び出しFlush()Clear()100 ~ 500 個のエンティティのバッチを処理した後、速度は問題になりませんでした。

于 2011-10-11T14:54:48.147 に答える