单一查询中的NHibernate大数据检索

时间:2012-07-24 12:25:13

标签: sql-server-2005 nhibernate

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

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

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

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

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





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

    <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为每一行创建一个新查询并发送到数据库,这是一个开销。

2 个答案:

答案 0 :(得分:0)

问题可能是由于原因造成的;默认情况下,NHibernate不会完全限定发送到SQL Server的查询中的表名。要充分利用sp_execsql,请求必须包含完全限定的表名。

要完全限定NHibernate查询,请在app / web.config文件中,在NHibernate设置中添加以下键:

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

(根据需要替换 dbo 。)

尝试一下并告诉我们它是否能提升你的性能?

答案 1 :(得分:0)

首先,我认为您必须验证造成性能问题的原因。

正如菲利斯·波拉诺已经提过的那样,可能是你面临select n+1 issue。这可以通过修改映射来解决,或者通过指定必须在您使用的标准中使用的FetchMode来检索数据。

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

但是,为了解决这个问题,我想你需要更多的意见。