Grails,使用 withTransaction 插入大量数据会导致 OutOfMemoryError

2024-01-10

我正在使用 Grails 1.1 beta2。我需要将大量数据导入到我的 Grails 应用程序中。如果我重复实例化一个 grails 域类然后保存它,性能会慢得令人无法接受。以从电话簿导入人员为例:

for (each person in legacy phone book) {
    // Construct new Grails domain class from legacy phone book person
    Person person = new Person(...)
    person.save()
}

事实证明这速度慢得令人痛苦。 Grails 邮件列表中的某人建议在事务中批量保存。所以现在我有:

List batch = new ArrayList()
for (each person in legacy phone book) {
    // Construct new Grails domain class from legacy phone book person
    Person person = new Person(...)
    batch.add(person)
    if (batch.size() > 500) {
        Person.withTransaction {
            for (Person p: batch)
                p.save()
            batch.clear()
        }
    }
}
// Save any remaining
for (Person p: batch)
    p.save()

这个工作必须更快,至少在最初是这样。每笔交易保存500条记录。随着时间的推移,交易时间越来越长。前几笔交易大约需要 5 秒,然后它就会从那里开始慢慢蔓延。大约 100 笔交易后,每笔交易都需要一分钟以上,这再次令人无法接受。更糟糕的是,Grails 最终会耗尽 Java 堆内存。我可以增加 JVM 堆大小,但这只会延迟OutOfMemoryError例外。

有什么想法吗?好像有一些内部资源没有被释放。性能变得更差,内存被占用,然后最终系统耗尽内存。

根据Grails 文档 http://grails.org/doc/1.0.x/ref/Domain%20Classes/withTransaction.html, withTransaction将闭包传递给 Spring 的TransactionStatus目的。我找不到任何东西TransactionStatus关闭/结束交易。

Edit:我从 Grails 控制台运行这个(grails console)

Edit:这是内存不足的异常:

Exception thrown: Java heap space

java.lang.OutOfMemoryError: Java heap space
    at org.hibernate.util.IdentityMap.entryArray(IdentityMap.java:194)
    at org.hibernate.util.IdentityMap.concurrentEntries(IdentityMap.java:59)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:113)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:732)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:701)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)

特德·纳莱德写了一篇很棒的博客条目 http://www.naleid.com/2009/10/01/batch-import-performance-with-grails-and-mysql.html关于提高批量性能。包括这里作为参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Grails,使用 withTransaction 插入大量数据会导致 OutOfMemoryError 的相关文章

随机推荐

  • 通过XPath获取tr中特定td的索引

    我的表中有 thead 和 tbody Thead 包含几个 s 每个都有一个 id 我需要通过 id 在 thead 中查找 td 的索引 然后在 tbody 中通过索引查找 table thead tr td td td td find
  • 如何决定spring kafka设置的并发数?

    我正在使用 KafkaListener 注释编写一个 kafka 消费者 我知道有一种方法可以使用 ConcurrentKafkaListenerContainerFactory 中的方法增加来自不同分区的并发 kafka 消费者的数量 e
  • 如何更改TWebBrowser中的字体?

    这个问题与 在 TWebBrowser 中加载字符串 HTML 代码 的最佳方法是什么 https stackoverflow com questions 39773033 which is the best way to load a s
  • Angular2:如何绑定以选择多个

    我可以使用绑定ngModel对于单个选择 但我想将一个数组绑定到多个选定的选项 当我尝试这样做时 我收到错误 在 myModelProperty 中找不到不同的支持对象 xxx My Code
  • 删除“.”之后的部分字符串

    我正在使用 NCBI 参考序列登录号 例如变量a a lt c NM 020506 1 NM 020519 1 NM 001030297 2 NM 010281 2 NM 011419 3 NM 053155 2 要从 biomart 包中
  • 如何修改请求的http header; C# 中的网络参考

    我正在创建一个使用 Web 服务的 NET 应用程序 我需要在对该 Web 服务的请求中将连接 http 标头设置为 关闭 我已经在谷歌上搜索了一天 但没有找到任何有用的东西 我最大的努力是下面的代码 它尝试重写 GetWebRequest
  • 开关与切换

    我正在尝试决定是否使用开关或切换来设置闹钟 我是我的 Android 应用程序 对 android 相当陌生 不知道或不太理解框架工作的所有来龙去脉 选择通过切换开关触发警报 反之亦然 会有什么缺点 android框架中有可用的滑动切换吗
  • Visual Studio 命令栏“名称”

    在 Visual Studio 2010 中 您可以创建的唯一选项是 菜单栏 上 工具 下的命令栏 在某些情况下 我想知道如何将命令栏放置在标准栏上 或者在右键单击项目文件时找到 Example Microsoft VisualStudio
  • 如何递归调用 WriteJson?

    我使用 Json Net 当我序列化一个Department2对象和WriteJson 被调用我希望它被递归地调用每个Telephone2像我一样的物体ReadJson 我怎么做 using System using Newtonsoft
  • 使用完全外连接连接 pandas 中的两个数据帧

    我在 pandas 中有两个数据框 如下所示 EmpID 是两个数据帧中的主键 df first pd DataFrame 1 A 1000 2 B np NaN 3 np NaN 3000 4 D 8000 5 E 6000 column
  • 限制直接 API 网关调用,除非来自 CloudFront

    我们在 API 前面创建了一个 CloudFront 是否可以限制来自 CloudFront 之外的 API 调用 当前设置 调用者 gt API 网关端点 gt Lambda 调用者 gt CloudFront 端点 gt API 网关端
  • Android GCM 消息发送时间过长

    我在我的应用程序中使用 GCM 但遇到了问题 大多数时候我会立即收到消息 但有时消息会在 5 分钟后收到 一条接着一条 就像它们被困在路上一样 这是正常的吗 客户端手机上的GCM框架部分使用TCP连接在端口 5228 上 此连接用于推送通知
  • 检查一个数组是否是另一个数组的子集

    关于如何检查该列表是否是另一个列表的子集有什么想法吗 具体来说 我有 List
  • 这总是GDB调试程序的地址吗?

    我将缩小我的问题范围 对于同一程序 GDB 中的入口地址保持不变 即使在重新启动后 以及在重写源代码后 这是为什么 例如0x80483f4是起始地址 0x80483f4
  • 为什么纯Python不能完全编译? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 为什么纯Python不能完全编译 编译或解释是实现的特征 而不是语言的特征 那么 难道不应该存在一些完全预先编译为本机代码的 Pyth
  • PHP:从未调用过 __autoload 函数

    所以 我有xampp 我在 ZendServer 上测试了这段代码 结果相同 在 php exe a index php 之后我有这个 Interactive mode enabled Fatal error Class Main not
  • 如何连接到第一行

    我将使用一个具体但假设的例子 Each Order通常只有一个行项目 Orders OrderGUID OrderNumber FFB2 STL 7442 1 3EC6 MPT 9931 8A 行项目 LineItemGUID Order
  • CUDA 内核可以是虚拟函数吗?

    这个问题非常简单 但让我概述一下我的框架 我有一个抽象类AbstractScheme表示一种计算类型 方程的一种离散化 但这并不重要 每个实现都必须提供一个方法来返回方案名称 并且必须实现一个受保护的函数 即 CUDA 内核 基本抽象类提供
  • 如何更改导航栏标题中链接和导航丸中链接的文本颜色(在闪亮的应用程序中)?

    这是我的闪亮应用程序的编辑版本 library shiny library bslib ui lt tagList fluidPage titlePanel tags head tags style HTML navbar default
  • Grails,使用 withTransaction 插入大量数据会导致 OutOfMemoryError

    我正在使用 Grails 1 1 beta2 我需要将大量数据导入到我的 Grails 应用程序中 如果我重复实例化一个 grails 域类然后保存它 性能会慢得令人无法接受 以从电话簿导入人员为例 for each person in l