Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate Criteria: большое время выполнения.


Автор: unhurt 26.11.2011, 20:40
Доброго времени суток!

Столкнулся с проблемой: используя Hibernate, делаем запрос в БД (PostgreSQL) с помощью Criteria. Время выполнения запроса просто критически огромное: около 1 минуты. Как с этим бороться я пока не знаю, прошу вашей помощи. Хочу так же заметить, что в проекте нету кэширования. 

Вот маппинг класса:

Код

    <class name="com.gs.api.dto.LocationDTO" table="LOCATION">
        <id name="id" column="location_id" type="integer" length="20">
            <generator class="sequence">
                <param name="sequence">LOCATION_SEQ</param>
            </generator>
        </id>

        <property name="status" column="STATUS" type="integer" not-null="true"/>

        <property name="onlineStatus" column="ONLINE_STATUS" type="boolean" not-null="true"/>

        <property name="hostingType" column="HOSTING_TYPE" type="integer" not-null="true"/>

        <property name="title" column="TITLE" type="string" not-null="true"/>

        <property name="description" column="DESCRIPTION" type="string" not-null="true"/>

        <property name="restrictions" column="RESTRICTIONS" type="string" not-null="true"/>

        <property name="architect" column="ARCHITECT" type="string" not-null="true"/>

        <property name="copyrights" column="COPYRIGHTS" type="string" not-null="true"/>

        <property name="creationDate" column="CREATION_DATE" type="date" not-null="true"/>

        <property name="blockTillDate" column="BLOCK_TILL_DATE" type="date"/>

        <property name="dateStatusChange" column="DATE_STATUS_CHANGE" type="date" not-null="true"/>

        <property name="timeZone" column="TIMEZONE" type="integer"/>

        <property name="code" column="LOCATION_CODE" index="LOCATION$2" type="string" unique="true"/>

        <property name="ownerAttention" type="boolean"    formula="(select count(lr.location_request_id)>0 from location_request lr where lr.location_id = location_id and lr.status in (5, 6, 7, 9))"/>

    <property name="deletable" type="boolean" formula="(select count(lr.location_request_id) = 0 from location_request lr where lr.location_id = location_id and lr.status > 2)"/>

        <many-to-one name="owner" column="ACCOUNT_ID" index="LOCATION$1" class="com.gs.api.dto.AccountDTO"
                     not-null="true" lazy="false" cascade="none" update="false" fetch="join"/>

        <many-to-one name="representative" column="REPRESENTATIVE_ID" class="com.gs.api.dto.RepresentativeDTO"
                     lazy="false" cascade="save-update" update="true" fetch="join"/>

        <many-to-one name="address" column="ADDRESS_ID" class="com.gs.api.dto.AddressDTO"
                     lazy="false" cascade="save-update" update="false" fetch="join"/>

        <many-to-one name="gps" column="GPS_ID" class="com.gs.api.dto.GPSDTO"
                     lazy="false" cascade="save-update" update="false" fetch="join"/>

        <bag name="keywords" table="LOCATION_TO_KEYWORD" cascade="save-update" lazy="true" batch-size="30">
            <key column="LOCATION_ID"/>
            <many-to-many class="com.gs.api.dto.KeywordDTO" column="KEYWORD_ID"/>
        </bag>

        <bag name="services" table="LOCATION_TO_SERVICE" cascade="save-update" lazy="true" batch-size="30">
            <key column="LOCATION_ID"/>
            <many-to-many class="com.gs.api.dto.ServiceDTO" column="SERVICE_ID" lazy="false"/>
        </bag>

        <bag name="locationTypes" table="LOCATION_TYPE_TO_LOCATION" cascade="save-update" lazy="false" batch-size="30">
            <key column="LOCATION_ID"/>
            <many-to-many class="com.gs.api.dto.LocationTypeDTO" column="LOCATION_TYPE_ID" lazy="false"/>
        </bag>

        <bag name="locationFinIncentives" table="LOCATION_TO_FIN_INCENTIVE" cascade="save-update" lazy="false" batch-size="30">
            <key column="LOCATION_ID"/>
            <many-to-many class="com.gs.api.dto.LocationFinIncentiveDTO" column="LOCATION_FIN_INCENTIVE_ID"
                          lazy="false"/>
        </bag>

        <bag name="projects" table="PROJECT_TO_LOCATION" cascade="none" inverse="true" lazy="true" batch-size="30">
            <key column="LOCATION_ID"/>
            <many-to-many class="com.gs.api.dto.ProjectDTO" column="PROJECT_ID" lazy="false"/>
        </bag>

        <bag name="blackouts" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.BlackoutDTO"/>
        </bag>

    <!--Special case, should not use  all-delete-orphan but only through LocationImageService -->
        <bag name="images" inverse="true" lazy="true" cascade="none" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.LocationImageDTO"/>
        </bag>

        <bag name="videos" inverse="true" lazy="true" cascade="none" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.LocationVideoDTO"/>
        </bag>

        <bag name="links" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.LinkDTO"/>
        </bag>

        <bag name="prices" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.PriceDTO"/>
        </bag>

        <bag name="publications" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.PublicationDTO"/>
        </bag>

        <bag name="requests" inverse="true" lazy="false" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.LocationRequestDTO"/>
        </bag>

        <bag name="sizes" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.SizeDTO"/>
        </bag>

        <bag name="specialOffers" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.SpecialOfferDTO"/>
        </bag>

        <bag name="updates" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.UpdateDTO"/>
        </bag>

        <bag name="travelInformation" inverse="true" lazy="true" cascade="all-delete-orphan" batch-size="30">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.TravelInfoDTO"/>
        </bag>

        <bag name="history" inverse="true" lazy="true" batch-size="30" cascade="all-delete-orphan" order-by="ACTION_DATE">
            <key column="LOCATION_ID"/>
            <one-to-many class="com.gs.api.dto.AdminHistoryDTO"/>
        </bag>
    </class>


Буду благодарен за любые советы.

Спасибо.

Автор: Stolzen 26.11.2011, 21:43
Могу порекомендовать отключить леньвость там, где не нужно, правильно настроить кеширование (т.е. добавить его); в самой базе - настроить индексирование.
И прочесть это http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

Добавлено через 1 минуту и 44 секунды
Да, и покажите сам запрос

Автор: Vasay 26.11.2011, 22:24
unhurt, 

Начните с анализа запроса, который делает Hibernate  к БД.

Возможно будет достаточно правильно настроить индексы.

Автор: unhurt 26.11.2011, 22:30
Цитата(Stolzen @ 26.11.2011,  21:43)
Могу порекомендовать отключить леньвость там, где не нужно, правильно настроить кеширование (т.е. добавить его); в самой базе - настроить индексирование.
И прочесть это http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

Добавлено @ 21:45
Да, и покажите сам запрос

Запрос генерирует Criteria полностью, так что в нём нет особого смысла, на мой взгляд. (можно, конечно, достать с помощью show_sql)

Добавлено через 1 минуту и 8 секунд
Цитата(Vasay @ 26.11.2011,  22:24)
unhurt, 

Начните с анализа запроса, который делает Hibernate  к БД.

Возможно будет достаточно правильно настроить индексы.

Спасибо, подумаю в этом направлении.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)