2015-05-14 66 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)時,我們不需要上述方法。 –

相關問題