2017-07-13 97 views
1

我在我的SQL Server实例创建JSON数据,并试图将其插入在golang使用大容量插入操作couchbase桶(约5000条记录)。这里的问题是整个数据没有被推送,并且只有插入了随机数量的记录(在2000到3000之间)。gocb:批量插入到couchbase使用golang-整个数据没有被插入

的代码是:

package main 

import (
    "database/sql" 
    "log" 
    "fmt" 
    _ "github.com/denisenkom/go-mssqldb" 
    "gopkg.in/couchbase/gocb.v1" 
) 


func main() { 
    var (
     ID string 
     JSONData string 
    ) 

    var items []gocb.BulkOp  
    cluster, _ := gocb.Connect("couchbase://localhost") 
    bucket, _ := cluster.OpenBucket("example", "") 

    condb, _ := sql.Open("mssql", "server=.\\SQLEXPRESS;port=62587; user id=<id>;password=<pwd>;") 

    // Get approx 5000 Records From SQL Server in JSON format 
    rows, err = condb.Query("Select id, JSONData From User") 
    if err != nil { 
     log.Fatal(err) 
     err = nil 
    } 

    for rows.Next() { 
     _ = rows.Scan(&ID,&JSONData) 
     items = append(items, &gocb.UpsertOp{Key: ID, Value: JSONData}) 
    } 

    //Bulk Load JSON into Couchbase 
    err = bucket.Do(items) 
    if err != nil { 
     fmt.Println("ERRROR PERFORMING BULK INSERT:", err) 
    } 

    _ = bucket.Close() 
} 

请告诉我,我哪里错在这里。

FYI列ID和JSONdata在SQL查询中包含有效的键和JSON字符串。此外,任何改善建议,在编码的方式将不胜感激。

+0

你如何验证2-3000?从Couchbase网络用户界面?一个建议(主要是作为安全)将使用insert()而不是upsert,以防万一id不唯一。 –

+0

@MattIngenthron我实际上是调用一个存储过程,用每个记录的唯一文档ID填充用户表中的数据,我也尝试过使用Insert操作。即使我冲洗桶并插入一批新的数据,我也会得到相同的结果。是的,我正在观察从Couchbase网络用户界面插入的数量 –

回答

0

我错过了检查InsertOp类型的Err字段,当我这样做时,我知道当数据超过容量时,items数组溢出,并且当您打印该字段时,屏幕上显示消息“队列溢出”

for i := range items { 
    fmt.Println(items[i].(*gocb.InsertOp).Err) 
} 

Attatched错误消息的屏幕截图是在这里: Err.png

是否有此限制任何变通方法从数据分离成一批批和执行多个批量插入分开?

0

为什么不尝试使用数量够程和一个通道同步它们。创建一个需要插入的项目的通道,然后启动16个或更多从通道读取的goroutine,执行插入,然后继续。一个严格的串行插入器最常见的明显瓶颈是网络往返,如果你有许多goroutines一次执行插入,你将大大提高性能。

P.S.批量插入不插入每个文档的问题是一个奇怪的问题,我将看看这个。正如上面提到的@ingenthr,是否有可能你正在做upsert并且对同一个键有多个操作?

老问题,在错误的答案部分: 您是否获得从散装的任何错误输出插入?

+0

没有错误。正如我所说,当我执行它时,只有部分数据被上传。我试图通过在循环中插入一个插入n1ql查询另一种选择,它工作(部分),但我得到额外的双引号和反斜杠在JSON加上使用循环将是一种低效率的方式,我想我需要构建此实用程序插入每秒5000个文件。 –

+0

另外我知道,couchbase处理插入的能力远远超过这个,但我不知道是什么阻止此程序一次只插入一堆文档。 –

+0

Goroutine似乎是目前这个问题的最佳解决方案,thx的建议,但仍然是问题困扰我很多。正如我在@ingenthr的回复中所提到的,我很确定存储桶中没有与我试图插入的数据具有相同ID的文档。我不得不将数据分成3批,并进行3批量插入操作以获得完整的数据,但速度在这里是一个大问题(加上要插入的文档数量也增加了)。我希望我可以在单个批量插入操作中插入尽可能多的文档。 –