Как сделать картирование, чтобы улучшить скорость приложения? - PullRequest
1 голос
/ 16 августа 2011

У меня проблема с моими сопоставлениями Сотрудник и Проект: например, в отображении Сотрудника у меня есть «сумка» для сопоставления других таблиц.Проблема в том, что когда я открываю окно сотрудника, это занимает много времени (10 секунд), открывая окно, как я могу сделать сопоставление лучше и быстрее?Может быть, в lazy или в загрузке?.

Это отображение для 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 ]

1 голос
/ 17 августа 2011

Вы должны использовать 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").

Один из популярных подходов состоит в том, чтобы все ассоциации были ленивыми (Lazy Default Fetch Plan).А затем используйте энергичную загрузку в тех местах, где вы уверены, что вам понадобится загруженная ассоциация.Это, однако, зависит от вашего управления сеансом, потому что отложенная загрузка не будет работать, если сеанс больше не доступен.В этой книге .

очень хорошее описание планов и стратегий получения.
0 голосов
/ 17 августа 2011

Для отображения вашей сумки удалите lazy = "false". Это ленивый по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...