为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
皈依舞 2023-01-03 16:47:06
我刚开始使用 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只是为了举例。我在这里错过了什么?
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

所有其他响应都有帮助,但直到我提出该建议并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']"


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号