我有一个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()
}
}
}
答案 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