4

私はcouchbasesのサイトであなたのサンプルコードを使用しています.Javaを使用しており、jdkのバージョンは1.6です.キーによる値の設定と取得は問題ありませんが、ビューを照会すると常にエラーが発生します.

これが私のコードです:

package src.main.java;
import com.couchbase.client.CouchbaseClient;
import com.couchbase.client.protocol.views.Query;
import com.couchbase.client.protocol.views.View;
import com.couchbase.client.protocol.views.ViewResponse;
import com.couchbase.client.protocol.views.ViewRow;
import java.net.URI;
import java.util.Arrays;
import java.util.List;


    public class HelloWorld {
      public static void main(String[] args) throws Exception {
        // (Subset) of nodes in the cluster to establish a connection
        List<URI> hosts = Arrays.asList(
          new URI("http://192.168.174.128:8091/pools")
        );
        // Name of the Bucket to connect to
        String bucket = "default";
        // Password of the bucket (empty) string if none
        String password = "";
        // Connect to the Cluster
        CouchbaseClient client = new CouchbaseClient(hosts, bucket, password);

        // 1: Load the View infos
        String designDoc = "users";
        String viewName = "by_firstname";
        View view = client.getView(designDoc, viewName);
        // 2: Create a Query object to customize the Query
        Query query = new Query();
        query.setIncludeDocs(true); // Include the full document body

        // 3: Actually Query the View and return the results
        ViewResponse response = client.query(view, query);

        // 4: Iterate over the Data and print out the full document
        for (ViewRow row : response) {
          System.out.println(row.getDocument());
        }
        // Shutting down properly
        client.shutdown();
      }
    }

エラーログはこちら

2013-08-03 11:17:21.779 ERROR com.couchbase.client.ViewNode$EventLogger:  Connection timed out: [192.168.174.128/192.168.174.128:8092]
Exception in thread "main" java.lang.RuntimeException: Timed out waiting for operation
    at com.couchbase.client.internal.HttpFuture.get(HttpFuture.java:67)
    at com.couchbase.client.CouchbaseClient.getView(CouchbaseClient.java:483)
    at src.main.java.HelloWorld.main(HelloWorld.java:75)
Caused by: java.util.concurrent.TimeoutException: Timed out waiting for operation
    at com.couchbase.client.internal.HttpFuture.waitForAndCheckOperation(HttpFuture.java:85)
    at com.couchbase.client.internal.HttpFuture.get(HttpFuture.java:74)
    at com.couchbase.client.internal.HttpFuture.get(HttpFuture.java:64)
    ... 2 more

Web 管理コンソールから、既にビューを公開していることがわかります。そのコンソールでも機能します。ファイアウォールは閉じられており、couchbase 2.0.0 Community エディションと 2.1.1 Community エディションを試しました。

4

1 に答える 1

2

最近、この同じ問題に遭遇しました。ビューは管理コンソールで正常に動作しますが、クライアントは getView() の呼び出しでタイムアウトします。これは、ビュー定義を取得するための HTTP リクエストがタイムアウトまたは失敗するたびに発生する可能性があり、どのネットワークでも発生する可能性があります。

getView() は、クエリ対象のビューの定義を取得するだけです。Couchbase の公式ドキュメントによると、クエリを実行する必要があるたびに getView() を呼び出すのではなく、これらの View 定義を実際にアプリケーションにキャッシュする必要があります。

CouchbaseClient オブジェクトで .getView(String, String) メソッドを呼び出すたびに、HTTP リクエストがサーバーに送信されます。前のセクションで説明したように、View オブジェクトはビューの内容を表現したものにすぎません。この情報は本番環境ではあまり変わりません。

ベスト プラクティスとして、getView を 1 回だけ呼び出してから、返されたオブジェクトをキャッシュし、後続のすべてのクエリ呼び出しで再利用します。そうすれば、帯域幅と待ち時間を節約できるだけでなく、サーバーが実行する必要のある作業量も削減できます。

ソース: http://docs.couchbase.com/couchbase-sdk-java-1.4/#reusing-view-definitions

于 2015-07-01T20:16:00.113 に答える