我正在尝试使用一个域类/表的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万条记录的唯一方法。但是对于该功能,我必须付出努力来开发它,在遇到另一个失败之前,我会听取您的建议。
问题:
我应该从这里继续吗?初始化应用程序的最佳方法是什么?
答案 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()
}
}
}
}
再次感谢您将我引向该解决方案!