2017-07-13 100 views
1

我在我的SQL Server實例創建JSON數據,並試圖將其插入在golang使用大容量插入操作couchbase桶(約5000條記錄)。這裏的問題是整個數據沒有被推送,並且只有插入了隨機數量的記錄(在2000到3000之間)。gocb:批量插入到couchbase使用golang-整個數據沒有被插入

的代碼是:

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

請告訴我,我哪裏錯在這裏。

FYI列ID和JSONdata在SQL查詢中包含有效的鍵和JSON字符串。此外,任何改善建議,在編碼的方式將不勝感激。

+0

你如何驗證2-3000?從Couchbase網絡用戶界面?一個建議(主要是作爲安全)將使用insert()而不是upsert,以防萬一id不唯一。 –

+0

@MattIngenthron我實際上是調用一個存儲過程,用每個記錄的唯一文檔ID填充用戶表中的數據,我也嘗試過使用Insert操作。即使我沖洗桶並插入一批新的數據,我也會得到相同的結果。是的,我正在觀察從Couchbase網絡用戶界面插入的數量 –

回答

0

我錯過了檢查InsertOp類型的Err字段,當我這樣做時,我知道當數據超過容量時,items數組溢出,並且當您打印該字段時,屏幕上顯示消息「隊列溢出」

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

Attatched錯誤消息的屏幕截圖是在這裏: Err.png

是否有此限制任何變通方法從數據分離成一批批和執行多個批量插入分開?

0

爲什麼不嘗試使用數量夠程和一個通道同步它們。創建一個需要插入的項目的通道,然後啓動16個或更多從通道讀取的goroutine,執行插入,然後繼續。一個嚴格的串行插入器最常見的明顯瓶頸是網絡往返,如果你有許多goroutines一次執行插入,你將大大提高性能。

P.S.批量插入不插入每個文檔的問題是一個奇怪的問題,我將看看這個。正如上面提到的@ingenthr,是否有可能你正在做upsert並且對同一個鍵有多個操作?

老問題,在錯誤的答案部分: 您是否獲得從散裝的任何錯誤輸出插入?

+0

沒有錯誤。正如我所說,當我執行它時,只有部分數據被上傳。我試圖通過在循環中插入一個插入n1ql查詢另一種選擇,它工作(部分),但我得到額外的雙引號和反斜槓在JSON加上使用循環將是一種低效率的方式,我想我需要構建此實用程序插入每秒5000個文件。 –

+0

另外我知道,couchbase處理插入的能力遠遠超過這個,但我不知道是什麼阻止此程序一次只插入一堆文檔。 –

+0

Goroutine似乎是目前這個問題的最佳解決方案,thx的建議,但仍然是問題困擾我很多。正如我在@ingenthr的回覆中所提到的,我很確定存儲桶中沒有與我試圖插入的數據具有相同ID的文檔。我不得不將數據分成3批,並進行3批量插入操作以獲得完整的數據,但速度在這裏是一個大問題(加上要插入的文檔數量也增加了)。我希望我可以在單個批量插入操作中插入儘可能多的文檔。 –