如何使映射提高应用程序的速度?

时间:2011-08-16 18:31:19

标签: nhibernate mapping

我的映射Employee和Project有问题:例如在Employee映射中,我有“bag”来映射其他表。问题是当我打开Employee窗口时,这需要花费大量时间(10秒)打开Window,如何使映射更好,也更快?也许在 lazy 或在fetch中?。

这是Employee的映射:

  <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="AdminProject"
                   namespace="AdminProject.Business.Entity">
  <class name="Employee">

    <id name="EmployeeId" type="int">     
    </id>

    <property name="OperatorNum" 
        generated="always" 
        update="false" 
        insert="false" 
        type="int"/>
    <property name="Password" type="string"/>
    <property name="Name" type="string"/>
    <property name="LastName" type="string"/>
    <property name="DateBegin" type="DateTime"/>
    <property name="DateEnd" type="DateTime"/>
    <property name="Telephone" type="string"/>
    <property name="Address" type="string"/>

    <many-to-one 
        name="EmployeeState" 
        column="EmployeeStateId" 
        class="EmployeeState" 
        fetch="join"/>

    <bag name="EmployeebyProject" lazy="false">
      <key column="EmployeeId"/>
      <one-to-many class="EmployeebyProject"/>
    </bag>

    <bag name="EmployeeComments" lazy="false">
      <key column="EmployeeId"/>
      <one-to-many class="EmployeeComments"/>
    </bag>

  </class>

</hibernate-mapping>

谢谢..

2 个答案:

答案 0 :(得分:1)

您应该使用SQL Server Profiler来确定从数据库加载的内容。或者,您可以将NHibernate设置为记录SQL。通过这种方式,您可以更轻松地查看导致延迟的原因。很可能是因为急切地加载集合(你的映射有lazy="false")。如果是这种情况,您只需将其设置为true(默认值)。

<bag name="EmployeebyProject" lazy="true">
  <key column="EmployeeId"/>
  <one-to-many class="EmployeebyProject"/>
</bag>

<bag name="EmployeeComments" lazy="true">
  <key column="EmployeeId"/>
  <one-to-many class="EmployeeComments"/>
</bag>

您的多对一关联也会急切地加载(fetch="join")。

一种流行的方法是使所有关联变得懒惰(懒惰默认获取计划)。然后在您确定需要加载关联的地方使用预先加载。但是,这取决于您的会话管理,因为如果会话不再可用,延迟加载将不起作用。这个book中有一个很好的描述获取计划和策略。

答案 1 :(得分:0)

对于您的行李贴图,请删除lazy =“false”。它默认是懒惰的。