用10k记录初始化Grails应用程序

时间:2019-03-21 13:43:46

标签: grails

我正在尝试使用一个域类/表的10k条记录作为初始数据集来初始化一个新的Grails应用程序。

挑战:

我不想将它们注入数据库,因为我希望它们通过所有Grails验证程序运行。

我到目前为止所做的事情:

对于初始数据集,在我的开发PC上,我已将它们注入数据库(通过 Talend Open Studio for Data Integration ),然后生成了10k条New语句,如下所示:

New Entity(prop1:'val1',prop2:'val2');

我在Bootstrap中尝试了数百个,效果很好。然后,我尝试使用其中的10k,并且Groovy编译器有时会堆栈跟踪Class file too large,有时它会保持安静并停在那里。

基本想法是拥有

if (Entity.count == 0) {
    loadDataService.loadData()
}

我几乎不想承认,但是我也尝试创建10个服务,每个服务有1000条记录,然后彼此依次加载,但是我的IDE中的内存消耗已达到空间,一切停滞了,有时出现并说出java.lang.RuntimeException: Method code too large!(Java方法中限制为64kb,这是有道理的)。

我还有什么想法:

使用Rest-API似乎是顺利获取1万条记录的唯一方法。但是对于该功能,我必须付出努力来开发它,在遇到另一个失败之前,我会听取您的建议。

问题:

我应该从这里继续吗?初始化应用程序的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

得益于strcpy@Daniel的帮助,我已经解决了它 在解决问题的过程中,我遇到了另一个问题:每条记录之后,运行时记录的数量大量增加,因此我不得不清除休眠会话。这样,运行时就像“每2-3秒记录100条记录”,因此它是线性的。 @elixir提供了解决方案的这一部分。

所以我最终得到了这段代码:

Bootstrap.groovy:

    if (Entity.count == 0) {
        println "No Entity found - Launch initial import"
        loadDataService.loadData()
        println "Initial import finished"
    }

loadDataService 内部:

SessionFactory sessionFactory
def loadData() {
    def inputFile = new File(grailsApplication.config.getProperty('importentitypath'))
    def InputJSON = new JsonSlurper().parseFile(inputFile, 'UTF-8')
    int mycounter = 0
    InputJSON.each{
        if (it.key=="data"){
            it.value.each {myrow ->
                mycounter+=1
                if ((mycounter % 100) == 0 ) {
                    println mycounter
                }
                Entity.withNewTransaction {
                    Entity.findByRowkey(myrow.rowkey)?:new Entity(
                            rowkey:myrow.rowkey,
                            property1: myrow.property1,
                            property2: myrow.property2,
                            ....
                    ).save(failOnError:true, flush:true)
                }
                sessionFactory.currentSession.clear()
            }
        }
    }
}

再次感谢您将我引向该解决方案!