gocb:使用golang将其批量插入床型数据库-不会插入整个数据

I am creating JSON Data (approx. 5000 records) in my SQL server instance and trying to Insert it into couchbase bucket using bulk insert operation in golang. The problem here is that entire data is not being pushed and a random number of records (between 2000 to 3000) are being insert only.

The code is:

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

Please tell me where I went wrong here.

FYI the columns ID and JSONdata in sql query contain valid key and JSON strings. Also, any improvement advice in the the way its coded will be appreciated.

ds0409
ds0409 实际上,我正在调用一个存储过程,该存储过程使用每个记录的唯一文档ID填充用户表中的数据,我也尝试使用插入操作。即使刷新存储桶并插入新的一批数据,我也会得到相同的结果。是的,我正在观察CouchbaseWebUI的插入次数
大约 3 年之前 回复
drurhg37071
drurhg37071 您如何验证2-3000?从CouchbaseWebUI?一种建议(主要是为了安全起见)是使用insert()而不是upsert,以防万一id不唯一。
大约 3 年之前 回复

2个回答



我错过了检查InsertOp类型的Err字段,当我这样做时,我知道当数据超过时,items数组会溢出 它的容量,并且当您为i:=范围项目{
fmt.Println(items [i])打印该字段时,屏幕上会显示一条消息'队列溢出'。</ p>

   (* gocb.InsertOp).Err)
}
</ code> </ pre>

错误消息的附加屏幕快照位于此处:
Err.png </ p>

除了将数据拆分为 批次数量并执行多个批量插入? </ p>
</ div>

展开原文

原文

I missed checking the Err field of InsertOp type and when I did that, I came to know that the items array overflows when the data exceeds it's capacity and a message 'queue overflowed' shows on the screen when you print that field

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

Attatched screenshot of the error message is here: Err.png

Is there any workaround for this limitation apart from splitting the data into a number of batches and performing multiple bulk inserts?



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

P.S。 批量插入未插入每个文档的问题是一个奇怪的问题,我将对此进行研究。 就像上面提到的@ingenthr一样,您是否有可能正在做upsert的操作,并且对同一键有多个操作?</ p>

旧问题,在“答案”部分中有错误提示:
您得到了任何答案吗? 批量插入错误输出?</ p>
</ div>

展开原文

原文

Why not try using a number of goroutines and a channel to synchronize them. Create a channel of items that need to be inserted, and then start 16 or more goroutines which read form the channel, perform the insert and then continue. The most common obvious bottleneck for a strictly serial inserter is going to be the network round-trip, if you can have many goroutines performing inserts at once, you will vastly improve the performance.

P.S. The issue with bulk insert not inserting every document is a strange one, I am going to take a look into this. As @ingenthr mentioned above though, is it possible that you are doing upsert's and have multiple operations for the same keys?

Old Question, In the Answers section in error: Are you getting any error outputs from the bulk insert?

dotws86260
dotws86260 此外,我在items数组中运行了一个循环,并验证了所有记录都已成功附加。 如果还有另一种方式进行批量插入(如其他任何类似的包装或类似的东西),请告诉我。
大约 3 年之前 回复
dongzhi4239
dongzhi4239 Goroutine似乎是目前针对该问题的最佳解决方案,尽管尚无所求,但问题仍然困扰着我很多。 正如我在对@ingenthr的回复中提到的那样,我很确定存储桶中没有与我要插入的数据具有相同ID的文档。 我不得不将数据分为3批,并进行3次大容量的插入操作,以获取完整的数据,但是在这里,速度是个大问题(要插入的文档数量也增加了)。 我希望我可以在一个批量插入操作中插入任意数量的文档。
大约 3 年之前 回复
dongping1012
dongping1012 我也知道沙发床处理插入的能力远不止于此,但是我不知道是什么原因阻止了该程序一次只插入一堆文件。
大约 3 年之前 回复
douyi0902
douyi0902 没错 就像我说的那样,当我执行它时,只有一部分数据被上传。 我通过将Insert n1ql查询放入循环中来尝试了另一种方法,它可以(部分地)工作,但我在JSON中得到额外的双引号和反斜杠,加上使用循环,这是一种效率很低的方式,因为我需要构建此实用程序进行插入 每秒5000个文档。
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问