-2

現在、NHibernateを使用して50k 行のブロックを読み取っています。約20 分かかります。読み取るデータは、SQLSERVER 2005で 5 つ以上のテーブルを結合することによって準備されます。私の主な懸念は、NHibernateが行を取得するたびに新しいクエリを準備することです。これにはかなりの時間がかかります。

NHibernate は各行をオブジェクトにマップする必要があるため、必要なことはわかっていますが、読み取りが主な関心事である場合、このアプローチは役に立ちません。

コレクションを使用してデータを保存しているため、ステートレスセッションを使用できません

。パラメーターを介してフィルターを適用する必要もあります。ストアドプロシージャも実装しましたが、どういうわけか役に立ちませんでした。

大量のデータを処理する他の方法はありますか。





------編集-------
マップに使用していた2つの構成ファイルを次に示します

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="myNameSpace" assembly="myNameSpace">
    <class name="MyClass" table="TableNameFromDb">
        <id name="ID" column="ID">
            <generator class="native" />
        </id>
        <property name="prop1"/>
        <property name="prop2"/>

    <bag name="bag1" cascade="all-delete-orphan" inverse="false"  fetch="join" lazy="false">
            <key column="prop1"/>
            <one-to-many class="MyClass2" />
    </bag>
    </class>
</hibernate-mapping>    

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="myNameSpace" assembly="myNameSpace">
    <class name="MyClass2" table="TableNameFromDb2">
        <id name="prop2" column="ID">
            <generator class="native" />
        </id>
        <property name="prop2"/>
        <property name="prop3"/>

    </class>
</hibernate-mapping>




ここでの主な関心事は、NHibernate が行ごとに新しいクエリを作成し、オーバーヘッドであるデータベースに送信することです。

4

2 に答える 2

0

問題は理由による可能性があります。デフォルトでは、NHibernate は SQL Server に送信されるクエリ内のテーブル名を完全には修飾しません。最大限に活用sp_execsqlするには、リクエストに完全修飾テーブル名を含める必要があります。

NHibernate クエリを完全に修飾するには、app/web.config ファイルで、NHibernate 設定に次のキーを追加します。

<add value="my_DB_name.dbo" key="hibernate.default_schema" />

(必要に応じてdboを置き換えます。)

試してみて、パフォーマンスが向上するかどうか教えてください。

于 2012-07-24T12:37:41.803 に答える
0

まず、パフォーマンスの問題の原因を確認する必要があると思います。

Felice Pollano が既に述べたように、select n+1 issueに直面している可能性があります。これは、マッピングを変更するか、データの取得に使用している Criteria で使用する必要がある FetchMode を指定することで解決できる可能性があります。

考慮すべきもう 1 つの点は、これらすべての行を一度に取得する必要があるかどうかということです。あなたは何をしようとしているのですか?エンティティによって表されるすべてのデータが本当に必要ですか、それとも関心のある列のみをロードするプロジェクションを使用できますか? ページング
は​​使えますか? おそらく、MultiCriteriaを使用できます...

しかし、この問題を解決するためには、あなたからのさらなるインプットが必要だと思います。

于 2012-07-24T12:58:44.037 に答える