我正在创建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 query中的ID和JSONdata列包含有效的key和JSON字符串。此外,任何改进建议在其编码的方式将受到赞赏。
发布于 2017-07-18 19:57:33
我错过了检查InsertOp类型的Err字段,当我这样做时,我才知道当数据超出其容量时,项数组溢出,并且当您打印该字段时,屏幕上会显示一条消息'queue overflows
for i := range items {
fmt.Println( items[i].(*gocb.InsertOp).Err)
}错误消息的附加屏幕截图在此处:Err.png
除了将数据拆分成多个批处理和执行多个批量插入之外,是否有解决此限制的方法?
发布于 2017-07-14 05:36:15
为什么不尝试使用一些goroutine和一个通道来同步它们。创建需要插入的项的通道,然后启动16个或更多从通道读取的goroutines,执行插入,然后继续。对于严格的串行插入器来说,最常见的明显瓶颈是网络往返,如果您可以让多个goroutines同时执行插入,您将极大地提高性能。
附注:批量插入没有插入每个文档的问题是一个奇怪的问题,我将对此进行研究。正如@ingenthr上面提到的,你有没有可能正在做upsert,并且对相同的键有多个操作?
老问题,在error的Answers部分中:您是否从批量插入中获得任何错误输出?
https://stackoverflow.com/questions/45082446
复制相似问题