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

gocb: bulk insert into couchbase using golang- entire data is not being inserted

我正在我的 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 和 JSON 数据包含有效键和 JSON 字符串。此外,将不胜感激对其编码方式的任何改进建议。

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

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

老问题,答案部分错误: 您从批量插入中得到任何错误输出吗?

我错过了检查 InsertOp 类型的 Err 字段,当我这样做时,我开始知道当数据超出其容量时项目数组会溢出,并且当您打印时屏幕上会显示一条消息 'queue overflowed'那个字段

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

错误消息的附件截图在这里: Err.png

除了将数据分成多个批次并执行多个批量插入之外,是否有任何解决此限制的方法?