Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > hiberante, jdbc скорость выполнения запросов


Автор: slippery 1.10.2010, 15:16
Добрый день. Я занимаюсь разработкой web-приложений на java в качестве веб-сервера  использую tomcat, также использую такие фрэймворки как  spring, hibernate(как реализация EntityManger) и СУБД PostgreSQL. В последнее время по работе мне приходиться писать хранимые процедуры занимающие разбором огромного количества строк. Время выполнения такой процедуры если её запустить из консоли или pgadmin'a составляет минуту-две, процесс  субд «сжирает» весь процессор и не отпускает его пока не будет выполнен парсинг всех строк. Однако если я выполняю вызов хранимки средствами hibernate из web-приложения: EntityManager.createNativeQuery(query, class) , где  query — запрос, а class- класс куда «мапиться» результат, то процесс субд выполняющий данную хранимку становиться как бы  «пассивным», то есть он «сжирает» не весь процессор, а процентов 5-10 и соответственно выполняется уже не минуту, а 10 минут, что совершенно недопустимо. Особенно если параллельно вызывается много таких хранимых процедур. Отсюда возникает вопрос почему так происходит, как это исправить и от чего это зависит, от самого hiberanate или драйвера jdbc? Возможно нужно определенным образом как-нибудь настроить тот же hiberante ибо щас я в persistence.xml указал просто:
<persistence-unit name="" transaction-type="RESOURCE_LOCAL"/>, а СУБД подключаю как бин :    
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver"/>
   …................................................................................................................
</bean>

 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="false"/>
                <property name="generateDdl" value="false"/>
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/>
            </bean>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>


В итоге мне нужно сделать чтоб при вызове хранимок из java они выполнялись так же по скорости как и из консоли(сжирали весь проц и быстро работали) или pgadmin'а иначе весь проект 
оказывается нерентабельным из-за медленной скорости работы. 
Заранее благодарен за вашу помощь.

Автор: Vasay 1.10.2010, 15:58
slippery, 

На что бы я обратил внимание:

Когда вы работаете из консоли -от имени какого пользователя вы запускаете хранимую процедуру?

И от имени какого пользователя работает Hibernate ? Нет ли ограничения на ресурсы у на уровне пользователя? 

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