go couchbase (gocb) 错误 - 不明确的超时或明确的超时

我刚开始使用 Go 中的 Couchbase,使用库 gocb。


就像尝试向我的服务器查询特定 ID 并获得结果的概念证明一样。下面是修改后的代码示例。


cOpts := gocb.ClusterOptions{

        Authenticator: gocb.PasswordAuthenticator{

            Username: "user",

            Password: "pw",

        },

    }


    cluster, err := gocb.Connect("couchbase://my.dev.server.net/", cOpts)

    if err != nil {

        panic(err)

    }


    qOpts := gocb.QueryOptions{}


    // create query

    queryStr := "SELECT * FROM myBucket WHERE id = '123456789'"


    rows, err := cluster.Query(queryStr, &qOpts)

    if err != nil {

        panic(err)

    }


    fmt.Printf("rows: %v\n", rows)


    for rows.Next() {

        var intfc interface{}

        err = rows.Row(&intfc)

        if err != nil {

            panic(err)

        }

        fmt.Printf("interface result: %v\n", intfc)


    }

couchbase 服务器在 5.1 上。


我要么得到...


panic: ambiguous timeout | {"statement":"SELECT * FROM myBucketName WHERE id = '123456789'","client_context_id":"cdd52a06-c7a5-4d3d-8r26-99fg806d559e"}

...当我运行上面的代码时。

或者 如果我在之后输入以下几行,gocb.Connect(...我会得到之后的错误。


err = cluster.WaitUntilReady(25*time.Second, &gocb.WaitUntilReadyOptions{DesiredState: gocb.ClusterStateOnline})

if err != nil {

    panic(err)

}

...错误...


panic: unambiguous timeout | {"InnerError":{"InnerError":{"InnerError":{},"Message":"unambiguous timeout"}},"OperationID":"WaitUntilReady","Opaque":"","TimeObserved":25000263891,"RetryReasons":["NOT_READY"],"RetryAttempts":105,"LastDispatchedTo":"","LastDispatchedFrom":"","LastConnectionID":""}  

注意:我在这里更改了Username, Password, Server/connStr,bucket和id只是为了举例。


我在这里错过了什么?


皈依舞
浏览 158回答 1
1回答

qq_花开花谢_0

所有其他响应都有帮助,但直到我提出该建议并cluster.Bucket("mybucket")在连接后添加之后才起作用。缺少的一件事是输入“Bucket”名称。见下文...除了@vsr 的帮助和回答之外,我刚刚在网站上的文档中找到了一些关于此的内容。[https://docs.couchbase.com/go-sdk/current/howtos/n1ql-queries-with-sdk.html](Couchbase Docs)在刚刚入门的Golang例子中,在代码的注释中提到'对于服务器版本 6.5 或更高版本,您不需要在此处打开存储桶',然后下一行将打开一个存储桶。好资料。    cOpts := gocb.ClusterOptions{        Authenticator: gocb.PasswordAuthenticator{            Username: "user",            Password: "pw",        },    }    cluster, err := gocb.Connect("couchbase://my.dev.server.net/", cOpts)    if err != nil {        panic(err)    }    bucketName := "myBucket"    cluster.Bucket(bucketName)    qOpts := gocb.QueryOptions{}    // create query    queryStr := "SELECT * FROM myBucket WHERE id = '123456789'"    rows, err := cluster.Query(queryStr, &qOpts)    if err != nil {        panic(err)    }    fmt.Printf("rows: %v\n", rows)    for rows.Next() {        var intfc interface{}        err = rows.Row(&intfc)        if err != nil {            panic(err)        }        fmt.Printf("interface result: %v\n", intfc)    }只需添加该cluster.Bucket("myBucket")行即可完成这项工作。服务器很旧,是一个缺乏资源的开发服务器,所以我也提高了超时时间,因为我知道它会很慢。cOpts我通过将集群选项(在代码中命名)调整为以下来增加超时...    cOpts := gocb.ClusterOptions{        Authenticator: gocb.PasswordAuthenticator{            Username: "user",            Password: "pw",        },        TimeoutsConfig: gocb.TimeoutsConfig{            ConnectTimeout: 95 * time.Second,            QueryTimeout:   95 * time.Second,            SearchTimeout:  95 * time.Second,        },    }这会将超时时间延长到 95 秒,我不需要那么多,但服务器速度足够慢,以至于在 UI 中需要 40 秒才能完成相同的查询,所以我只是想确定一下。我还调整了查询的超时时间。我不确定它们之间有什么区别,但我在下面进行了调整。    qOpts := gocb.QueryOptions{}    qOpts.Readonly = true    qOpts.ScanWait = 95 * time.Second    qOpts.Timeout = 95 * time.Second此外,如果您不知道,我是 couchbase 的新手,查询没有使用索引字段。我查找了该存储桶的索引字段并将其添加到查询中,这样时间减少了一半以上。编辑:使用USE KEYSN1QL 中的语句似乎非常快,比任何查询都快。我调整了代码,所以qryStr查询字符串如下所示......queryStr := "SELECT * FROM myBucket USE KEYS ['123456789']"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go