2015-05-14 77 views
4

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

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

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() 
     } 
    } 
} 
+0

您应该使用像Spring Batch这样的批处理框架。它与Grails和Groovy结合使用效果很好。 –

回答

1

这是从原来的问题完全不同,所以如果我正确地理解它,你需要将不同的信息加载到通过不同数据源访问的表中。您的项目中定义了多个dataSources。 而你想用这些数据源使用groovy.sql.Sql。

你所有的数据源都是通过dataSource_dataSourceName Grails应用程序上下文中可用,所以它是作为注入数据源,为您的第一个代码段创造了艾利类似的方式,SQL对象一样容易:

def dataSource_lookup 
def dataSource_otherName 

static transactional=false 

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

注意为了能够通过不同的数据源进行交易,您需要放置XA交易。

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

+0

我写了我的代码在服务中,当我检查时,它看起来不像交易一样。我们如何使它成为transactional = true。我也用“static transactional = true”来检查,但事实并非如此。 –

+0

你不能没有XA事务管理器。您正在与2个不同的数据库交谈。 – loteq

+0

但是,我一次只使用一个连接,即一次将值保存到数据库的多个表中。所以这也是使用XA事务管理器的情况。请证实。 –

2

有由Ted Naleid了一篇文章,介绍了他的旅程GORM的批量性能显着提高。这是一篇旧文章,但可能值得尝试,看到令人印象深刻的性能增益。

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

基本上什么Grails中改变了一切,是增加你的服务如下:(从特德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 
    } 
} 

的格姆清理每一个X线使得批处理作业规模线性

+0

我认为当使用['withStatelessSession'](http://gorm.grails.org/latest/mongodb/manual/#_stateless_domain_classes)时,我们不需要上述方法。 –