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
除了将数据分成多个批次并执行多个批量插入之外,是否有任何解决此限制的方法?
我正在我的 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
除了将数据分成多个批次并执行多个批量插入之外,是否有任何解决此限制的方法?