gocb:使用golang整体插入couchbase-未插入整个数据

时间:2017-07-13 13:42:25

标签: sql-server go couchbase bulkinsert gocb

我在我的SQL服务器实例中创建JSON数据(大约5000条记录)并尝试使用golang中的批量插入操作将其插入到couchbase存储桶中。这里的问题是没有推送整个数据,只插入随机数量的记录(2000到3000之间)。

代码是:

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

请告诉我这里哪里出错了。

仅供参考,sql查询中的列ID和JSONdata包含有效密钥和JSON字符串。此外,任何改进建议的编码方式将受到赞赏。

2 个答案:

答案 0 :(得分:1)

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

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

错误消息的附加屏幕截图如下: Err.png

除了将数据拆分为多个批次并执行多个批量插入之外,是否存在此限制的解决方法?

答案 1 :(得分:0)

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

P.S。批量插入不插入每个文档的问题很奇怪,我将对此进行研究。正如上面提到的@ingenthr,你是否可能正在进行upsert并对同一个键进行多项操作?

旧问题,在错误的答案部分: 您是否从批量插入中获得任何错误输出?