执行<jdbc:initialize-database> </jdbc:initialize-database>时没有堆内存

时间:2012-07-19 21:31:24

标签: java spring hibernate hsqldb

context.xml中

<jdbc:initialize-database data-source="dataSource" ignore-failures="ALL">
    <jdbc:script location="classpath:scrubd.sql"/>
</jdbc:initialize-database>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
    <property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver"/>
    <property name="url" value="jdbc:hsqldb:mem:mydb"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
      depends-on="dataSource"
      name="_sessFac"> 
    <property name="dataSource" ref="dataSource"/>      
    <property name="configLocation" value="hibernate.cfg.xml.incDTD"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.connection.shutdown">true</prop>
        </props>
    </property>
</bean>

当我在单元测试中运行我的ant目标时,在第一次初始化spring之后,我出现内存不足错误。然而,当我通过简单地命名我的数据库import.sql来填充我的表并让hibernate处理它时,我没有得到这个内存不足的错误。

为什么会这样?

此外,在数据库中加载数据比使用hibernate要花费大约一秒钟。奖励指向可以解释原因的任何人。

StackTrace(来自蚂蚁)

Caused by: java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:2694)
at java.lang.String.<init>(String.java:234)
at java.lang.StringBuffer.toString(StringBuffer.java:561)
at org.apache.tools.ant.util.StringUtils.replace(StringUtils.java:92)
at org.apache.tools.ant.util.DOMElementWriter.encodedata(DOMElementWriter.java:501)
at org.apache.tools.ant.util.DOMElementWriter.write(DOMElementWriter.java:236)
at org.apache.tools.ant.util.DOMElementWriter.write(DOMElementWriter.java:221)

导致它的bean必须是我的会话工厂,因为我不会将<jdbc:initialize-database/>称为'bean'。

我想说基于堆栈跟踪,它将我的整个sql脚本读入一个字符串,因为它非常大; ~38K线。

1 个答案:

答案 0 :(得分:0)

结束只是说搞砸它,然后让hibernate填充我的表。事实上我在进行单元测试时正在读取一个20mB的文件,并且我仍然没有因为hibernate而出现内存错误,这让我觉得如果你想在对它们进行单元测试之前填充你的表,那就不要让春天去做吧。生活和学习。