【问题标题】:slow embedded database processing with hibernate使用休眠的嵌入式数据库处理速度慢
【发布时间】:2011-06-26 15:17:02
【问题描述】:

我在嵌入式模式下使用 h2 数据库,我也使用 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>

当我尝试插入数据时,数据库的工作速度非常非常慢,而且我的 IO 流非常大(与硬盘驱动器一样快)。我认为每次打开和关闭数据库时

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>

【问题讨论】:

  • 您的dataSource 看起来如何?是否使用连接池,配置参数是什么?
  • @benjamin-muschko 我已经为数据源添加了配置
  • 您将;DB_CLOSE_DELAY=1 附加到数据库URL 中?我不太了解Spring,但如果是DriverManagerDataSource,为什么不直接使用org.h2.Driver
  • 感谢DB_CLOSE_DELAY,我会试试,在这里写下结果。我认为org.h2.jdbcx.JdbcDataSource内部使用org.h2.Driver,所以差别不大。
  • 我已经添加了 DB_CLOSE_DELAY=-1 并且没有更多不必要的打开和关闭

标签: java hibernate orm h2 embedded-database


【解决方案1】:

实现org.springframework.jdbc.datasource.DriverManagerDataSource 在您请求时打开和关闭连接。

来自 JavaDoc:

注意:这个类不是实际的 连接池;它实际上并没有 池连接。它只是作为 简单替换成熟的 连接池,实现相同 标准接口,但创建新的 每次通话都有连接。

对于生产环境,强烈建议您使用连接池,该连接池可预先打开有限数量的连接并将它们汇集起来以供使用。对于您的dataSource,我会说使用Apache's Jakarta Commons DBCPC3P0This example 展示了如何设置 dataSource 以使用 DBCP。使用连接池肯定会减少查询数据库所花费的时间,并且肯定会解决您的问题。

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2014-02-03
    • 2012-01-06
    • 2022-01-25
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多