медленная обработка встроенной базы данных в спящем режиме - PullRequest
0 голосов
/ 26 июня 2011

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

<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>

, когда я пытаюсь вставить базу данных данных, работает очень, очень медленно, и у меня очень большой поток ввода-вывода (так быстро, как труднодиск умеет).Я думаю, что база данных открывается и закрывается каждый раз, когда вызывается

getHibernateTemplate().save(question);
.Что интересно, если я изменяю строку подключения для использования автономного сервера, эта проблема исчезает и все работает хорошо.

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

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>

1 Ответ

2 голосов
/ 26 июня 2011

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

Из JavaDoc:

ПРИМЕЧАНИЕ. Этот класс не является пул соединений; это на самом деле не Соединения бассейна. Это просто служит простая замена для полноценного пул соединений, реализующий то же самое стандартный интерфейс, но создание нового Соединения при каждом звонке.

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

...