如何在Grails中实现批处理

时间:2015-05-14 11:02:33

标签: grails gorm batch-processing

我有一个Grails应用程序,它实现了多个数据源,它的任务是在相应的数据源表中处理和保存excel数据(xlsx类型)。但是当excel文件包含大量数据并且需要更多时间来保存时,我遇到了问题。所以我使用SQL并通过批处理插入值,它工作正常并且花费最少的时间来保存值,但它将值保存到公共数据源表中。因此,我在多个数据源中的使用方式再次出现问题。

这工作正常,但我们如何在多个数据源中使用。我正在描述我们的查询 -

def dataSource      
def sql = new Sql(dataSource)        
sql.withBatch { stmt ->
    stmt.addBatch("INSERT INTO TableName(Fields...) values(.......)
    stmt.executeBatch() 
}

我不想通过列表实现它,因为它花了大约相同的时间进行保存,即

def dataSourceName = 'lookup'     
List list= []
(0..10000).each{
    Domain dom = new Domain('some property associated with domain class')
    batch.add(dom)
    if(list.size()>1000){ 
        for(Domain object in list){
            object."$dataSourceName".save()
        }
    }
}

2 个答案:

答案 0 :(得分:2)

Ted Naleid撰写的一篇文章描述了他在GORM中大幅改善批次性能的过程。这是一篇旧文章,但看到令人印象深刻的性能提升可能值得尝试。

http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql

基本上改变grails中的所有内容的是在服务中添加以下内容:(来自Ted Naleid的文章,因为你的问题根本不清楚你想要做什么,你只说你不想做什么)

class BookService {
    def sessionFactory
    def propertyInstanceMap = org.codehaus.groovy.grails.plugins.DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP

    def importBooksInLibrary(library) {
        library.eachWithIndex { Map bookValueMap, index ->
            updateOrInsertBook(bookValueMap)
            if (index % 100 == 0) cleanUpGorm()
        }
    }    

    def cleanUpGorm() {
        def session = sessionFactory.currentSession
        session.flush()
        session.clear()
        propertyInstanceMap.get().clear()
    }

    def updateOrInsertBook(Map bookValueMap) {
        // ... same as above
    }
}

GORM清理每x行使批处理作业线性化

答案 1 :(得分:1)

这与原始问题完全不同,因此如果我理解正确,您需要将不同的信息加载到通过不同dataSource访问的表中。您在项目中定义了多个dataSource。 并且您希望将groovy.sql.Sql与这些dataSources一起使用。

所有数据源都可以通过dataSource_dataSourceName在grails应用程序上下文中使用,因此它就像注入dataSource一样简单,并以与第一个代码片段非常相似的方式创建Sql对象:

def dataSource_lookup
def dataSource_otherName

static transactional=false

def doWork() {
  def sql=new Sql(dataSource_lookup)
}

请注意,为了能够在不同的dataSource上进行事务处理,您需要将XA事务放在适当的位置。

http://grails.github.io/grails-doc/2.2.1/guide/conf.html#multipleDatasources