执行 <jdbc:initialize-database> 时堆内存不足

Posted

技术标签:

【中文标题】执行 <jdbc:initialize-database> 时堆内存不足【英文标题】:Out of heap memory when executing <jdbc:initalize-database> 【发布时间】:2012-07-19 21:31:24 【问题描述】:

上下文.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 处理它来填充我的表时,我没有得到这个内存不足错误。

为什么会这样?

此外,Spring 将数据加载到数据库中所需的时间比休眠时间长大约一秒钟。任何能解释原因的人都会得到奖励。

StackTrace(来自 ant)

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 必须是我的会话工厂,因为我不会将 &lt;jdbc:initialize-database/&gt; 称为“bean”。

我想根据堆栈跟踪说它正在将我的整个 sql 脚本读入一个字符串,因为它非常大;约 38K 行。

【问题讨论】:

您能否编辑您的帖子以显示内存异常或至少显示它的最后几行。你能找出导致异常的 bean 吗? @Gray 你的愿望就是我的命令。 您使用的是哪个网络/应用服务器? 大约 38k 行的文件有多大(以字节为单位)?他们可能会将所有内容都加载到内存中,尽管这仍然应该只有几兆。另外,您使用的是什么 -Xmx 设置?你试过增加它吗? Xmx 为 512m,文件为 5.53 mB。而且我不想增加它,因为我在使用 import.sql 之前已经将文件读入了我的程序。 【参考方案1】:

最后只是说把它搞砸,然后让休眠填充我的表格。我现在在进行单元测试时正在读取一个 20mB 的文件,而且我仍然没有遇到 hibernate 的内存不足错误,这让我认为如果你想在对它们进行单元测试之前填充你的表,不要'不要让春天来做。生活和学习。

【讨论】:

以上是关于执行 <jdbc:initialize-database> 时堆内存不足的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 打包可执行jar包配置

Java - 在控制台中执行一个可执行jar

计算方法执行时间

ASP 一个页面执行 无线分类问题

如何在onclick里执行java代码

Python调用c++可执行程序