-2

我目前正在使用NHibernate读取50k 行的块。大约需要20 分钟。要读取的数据是通过在 SQLSERVER 2005 中加入超过5 个表来准备的。我主要关心的是 NHibernate为每个行检索准备一个新查询,这非常耗时。

我知道这是必要的,因为 NHibernate 必须将每一行映射到一个对象,但这种方法在阅读是主要关注点的情况下是无用的。

我不能使用无状态会话,因为我使用集合来存储数据

我还需要通过参数应用一些过滤器。我也实现了存储过程,但不知何故没有帮助。

有没有其他方法可以处理大量数据。





------编辑-------
这是我用来映射的两个配置文件

    <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 问题。这可以通过修改映射来解决,或者通过指定必须在您用于检索数据的条件中使用的 FetchMode 来解决。

您应该考虑的另一件事:真的有必要一次性检索所有这些行吗?你想做什么?您真的需要实体表示的所有数据,还是可以使用仅加载您感兴趣的列的投影?
你可以使用分页吗?
也许您可以使用MultiCriteria ...

但是,为了解决这个问题,我认为您需要更多的投入。

于 2012-07-24T12:58:44.037 回答