Ускорить вызовы NHibernate в Oracle? - PullRequest
0 голосов
/ 01 декабря 2008

Есть ли какие-либо оптимизации, которые следует учитывать при подключении к Oracle с помощью NHibernate? Мои звонки в Oracle занимают очень много времени. Если я запускаю запрос NHibernate (скопированный из моего окна вывода в Visual Studio) непосредственно в Oracle, он возвращается через секунду. Вот мой конфигурационный файл для NHibernate. При необходимости я могу опубликовать файлы сопоставления.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory name="DefaultSessionFactory">
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="dialect">NHibernate.Dialect.OracleDialect</property>
        <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
        <property name="connection.connection_string">Data Source=****;Persist Security Info=True;User ID=******;Password=*******;Unicode=True</property>
        <property name="show_sql">true</property>
        <mapping assembly="AQTool.BL"/>
    </session-factory>
</hibernate-configuration>

Обновление: Подводя итог всего обсуждения здесь:

Если я удаляю все связи «многие-к-одному» и просто запускаю свой модульный тест для одного объекта без объединений, запрос по-прежнему выполняется более 2 минут. Если я скопирую sql, сгенерированный nhibernate, и запусту его непосредственно с oracle, запрос вернется через секунду. Я также публикую свой картографический файл здесь. Есть ли что-то, чего мне не хватает, что может быть причиной такого несоответствия? Единственное, что я делаю, это выбираю по идентификатору аккаунта. Несмотря на то, что таблица большая (более 5 миллионов строк), поле идентификатора учетной записи клиента индексируется, и необработанный запрос возвращается очень быстро.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="AQTool.BL" assembly="AQTool.BL" default-lazy="true">
    <class name="AQTool.BL.EmailAddress,AQTool.BL" table="EMAIL_CUSTOMER_ADDRESSES">
        <id name="EmailAddressId" column="EMAIL_ADDRESS_ID" type="int">
            <generator class="native" />
        </id>
        <property name="CustomerAccountId" column="CUSTOMER_ACCOUNT_ID" type="string" />
        <property name="EmailAddressText" column="EMAIL_ADDRESS_TX" type="string" />
        <property name="EmailAddressTypeId" column="EMAIL_ADDRESS_TYPE_ID" type="int" />
        <property name="EmailAddressTypeIdInternal" column="EMAIL_ADDRESS_TYPE_ID_INTERNAL" type="int" />

    </class>
</hibernate-mapping>

Ответы [ 2 ]

1 голос
/ 01 декабря 2008

Вы можете рассмотреть возможность использования этого инструмента для «отладки NHibernate» Анализатор запросов NHibernate

0 голосов
/ 01 декабря 2008

Убедитесь, что ваш пул подключений достаточно большой. Кроме того, если вы попытаетесь отладить свой код, вы сможете увидеть, где Hibernate проводит большую часть своего времени. Это может быть с обработкой результатов, как кто-то прокомментировал ранее, особенно если у вас есть каскадные отношения. Если вы это сделаете, попробуйте выполнить эти запросы, используя subselect вместо lazy = false или fetch = join, поскольку это, вероятно, будет значительно быстрее.

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