2017-07-13 21 views
1

私はSQL ServerインスタンスにJSONデータ(約5000レコード)を作成していて、golangの一括挿入操作を使用してcouchbaseバケットに挿入しようとしています。ここで問題となるのは、データ全体がプッシュされておらず、ランダムなレコード数(2000〜3000)が挿入されているということです。gocb:golangを使用してcouchbaseに一括挿入 - 全体のデータが挿入されていません

コードは次のとおりです。私はここで間違っていたところ

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 sqlクエリの列IDとJSONdataには、有効なキーとJSON文字列が含まれています。また、コード化された方法での改善アドバイスが評価されます。

+0

2-3000をどのように確認していますか? Couchbase Web UIから? 1つの推奨事項(主に安全)は、idが一意でない場合に備えて、upsertではなくinsert()を使用することです。 –

+0

@MattIngenthron私は実際に各レコードの一意のドキュメントIDでユーザーテーブルのデータを設定するストアドプロシージャを呼び出して、私はあまりにも挿入操作を使用してみました。バケツを流して新しいバッチデータを挿入しても、同じ結果が得られます。そして、私はCouchbaseウェブUIからの挿入物の数を観察しています –

答えて

0

InsertOpタイプのErrフィールドをチェックしていなかったので、データが容量を超えたときにアイテム配列がオーバーフローし、そのフィールドを印刷すると「キューがオーバーフローしました」というメッセージが表示されることがわかりましたエラーメッセージのスクリーンショットを貼ら

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

はここにある: Err.png

は、この制限のための任意の回避策は離れバッチの数にデータを分割し、複数のバルク挿入を行うことからありますか?

0

いくつかのゴルーチンとチャンネルを同期させてみましょう。挿入する必要がある項目のチャンネルを作成し、16個以上のゴルーチンを起動してチャンネルを読み込み、挿入を実行してから続行します。厳密にシリアルインサータの最も一般的なボトルネックは、ネットワークのラウンドトリップになります。一度に多くのgoroutinesで挿入を実行すると、パフォーマンスが大幅に向上します。

P.S.すべての文書を挿入しない一括挿入の問題は奇妙なものです。私はこれを見ていきます。しかし、上記のように、あなたはupsertをやって、同じキーに対して複数の操作をしている可能性はありますか?

古い質問、エラーの回答セクション: 一括挿入のエラー出力がありますか?

+0

エラーはありません。私が言ったように、私はそれを実行すると、データの一部だけがアップロードされています。私はループ内にInsert n1qlクエリーを入れて別の方法を試みましたが、(部分的に)動作しますが、余分な二重引用符とバックスラッシュをJSON Plusに追加すると、このユーティリティを挿入してビルドする必要があると思います毎秒5000の文書。 –

+0

また、私はcouchbaseが挿入を処理する能力がこれ以上のものであることを知っていますが、私はこのプログラムが一度にたくさんの文書を挿入するのを防ぐことができません。 –

+0

Goroutineは現在この問題のための最良の解決策であると思われますが、アドバイスについてはthxですが、依然として問題は私をたくさん悩ませています。 @ingenthrへの返信で言及したように、バケツには、挿入しようとしているデータと同じIDを持つドキュメントはありません。データを3バッチに分割し、3つのバルクインサート操作を実行して完全なデータを取得する必要がありましたが、速度は大きな問題です(挿入するドキュメントの数も増えました)。私は単一の一括挿入操作で必要なだけ多くの文書を挿入できることを願っています。 –

関連する問題