より実用的で実行可能なプログラムを記述したい場合、サンプルコードをダウンロードしてください。プログラムは指定されたスレッド数のユーザを作成します。そしてそれぞれが100個のランダムな数字をCouchbase上に作成しようとします(あるいはCouchbaseから読み込もうとします)。このコードはCouchbaseClientのインスタンスオブジェクト各スレッド毎に生成します。そして特定のキーに対してgets()
操作を実行します。キーが設定されていない場合は、gets()
操作はnullを返します。このケースではスレッド自身が値を作成してCouchbaseにセットします。これを実行するには100ミリ秒のペナルティが発生するようになっています。これは、高価なデータベース操作をシミュレートしています。この小さなアプリケーションの完全なソースコードはこの記事の最後に添付されています。
このプログラムの一部を見て、Couchbase Serverに接続する基本的な方法が理解してみましょう。既存のキーバリューペアを評価し、特定のキーに対する値を設定します。これらのオペレーションはきっかけとなるアイデアを与えてくれるでしょう。
リスト 2 Couchbaseクラスタへの接続:
URI server = new URI(addresses); ArrayList<URI> serverList = new ArrayList<URI>(); serverList.add(server); CouchbaseClient client = new CouchbaseClient( serverList, "default", "");
これらの行から、CouchbaseClient
のインスタンスを取得する必要があることが分かります。インスタンスを構築する方法は多数ありますが、URIのArrayList
を利用したコンストラクタを利用するのが非常に便利です。
http://host-or-ip:port/pools
接続先のポートは8091になります。これはクラスタ内の他の全てのサーバを知っているプロキシで、迅速なプロトコルへのアクセスを提供します。したがって、このクラスタの場合、次のようにアドレスを文字列で与えても、上手く動きます:
String addresses = "10.0.0.33:8091/pools"
リスト3はCouchbase内のオブジェクトを必要に応じて整数に戻す際に便利な、IntegerTranscoderの作成部分を抜粋したものです。これは利便性のためであり、キャストする必要がなくなります。その後、gets()メソッドが呼び出されていることがわかります。これは値のチェックとセットに便利な整数型のCASValue<T>を返します。valueがnullの場合、Couchbaseはこのキーに対する値を保持していないことを意味します。その場合、値を設定します。もしくは、取得した値に対して何かを実行することができます。
リスト 3 チェックアンドセット(CAS)操作:
IntegerTranscoder intTranscoder = new IntegerTranscoder(); CASValue<Integer> value = client.gets(key, intTranscoder); if (value == null) { // Couchbase内に存在しない値 client.set(key, 15, rand.nextInt(), intTranscoder); // 生成にかかる時間をシミュレート Thread.sleep(100); created++; } else { int v = value.getValue(); }
Couchbaseの値設定は、非同期に行われ、アプリケーションはこれらが完了するまで待つ必要はありません。しかし時には、Couchbaseが確実にある値を設定したことを確認したいことあります。その場合、client.waitForQueues()
を利用してください。その際には、リスト4に示すように処理待ちのタイムアウトを指定します。
リスト4 Couchbaseに値がセットされるのを待ちます:
client.waitForQueues(1, TimeUnit.MINUTES);