медленная обработка встроенной базы данных с спящим режимом

Я использую базу данных h2 во встроенном режиме, также я использую спящий режим для доступа к ней. Это моя конфигурация spring, которую я использую для инициализации спящего режима:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

    <property name="dataSource">
        <ref bean="dataSource" />
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>

    <property name="annotatedClasses">
        <list>
            <value>classname1</value>
            <value>classname2</value>
            <value>classname3</value>
        </list>
    </property>
</bean>

when I try insert data database works very, very slow and I have very huge IO stream (as fast as hard drive is able). I think database is opened and closed every time when

getHibernateTemplate().save(question);
is called. What is interesting, if I change connection string to use standalone server this problem disappears and all works nice.

Что не так с моей конфигурацией для встроенных баз данных?

UPD

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.jdbcx.JdbcDataSource" />
    <property name="url" value="jdbc:h2:file:C:\temp\data.db" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

person michael nesterenko    schedule 26.06.2011    source источник
comment
Как выглядит ваш dataSource? Используете ли вы пул соединений и каковы параметры конфигурации?   -  person Benjamin Muschko    schedule 26.06.2011
comment
@benjamin-muschko Я добавил конфигурацию для источника данных   -  person michael nesterenko    schedule 26.06.2011
comment
Вы добавляете ;DB_CLOSE_DELAY=1 к URL-адресу базы данных? Я не слишком хорошо знаю Spring, но если это DriverManagerDataSource, почему бы вам просто не использовать org.h2.Driver?   -  person Thomas Mueller    schedule 26.06.2011
comment
Спасибо за DB_CLOSE_DELAY, попробую, о результатах напишу сюда. Я думаю, что org.h2.jdbcx.JdbcDataSource внутренне использует org.h2.Driver, так что это не большая разница.   -  person michael nesterenko    schedule 26.06.2011
comment
Я добавил DB_CLOSE_DELAY=-1 и больше никаких ненужных открытий и закрытий   -  person michael nesterenko    schedule 26.06.2011


Ответы (1)


Реализация org.springframework.jdbc .datasource.DriverManagerDataSource открывает и закрывает соединение всякий раз, когда вы его запрашиваете.

Из JavaDoc:

ПРИМЕЧАНИЕ. Этот класс не является фактическим пулом соединений; на самом деле он не объединяет соединения. Он просто служит простой заменой полномасштабного пула соединений, реализуя тот же стандартный интерфейс, но создавая новые соединения при каждом вызове.

Для производственных сред настоятельно рекомендуется использовать пул соединений, который заранее открывает ограниченное количество соединений и объединяет их для использования. Для вашего dataSource я бы посоветовал использовать Apache Jakarta Commons DBCP или C3P0. В этом примере показано, как настроить dataSource для использования DBCP. Использование пула соединений определенно сократит время, затрачиваемое на запросы к базе данных, и, безусловно, решит вашу проблему.

person Benjamin Muschko    schedule 26.06.2011