我目前正在使用 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为每一行创建一个新查询并发送到数据库,这是一个开销。
答案 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 ...
但是,为了解决这个问题,我想你需要更多的意见。