Symfoware

Symfowareについての考察blog

Voldemortのデータにオブジェクトを登録する方法(java-serialization使用)

DebianにVoldemortをインストール
Windows + Javaからの接続を試しました。
Debianにkey-value storage systemの「Voldemort」をインストールする
Debianで動作しているVoldemortをWindows + Javaで操作する


「keyやvalueにはシリアライズした色々なデータを登録できるよ」と
記載されているのですが、どうやって使用すればよいかわからずはまったので、
メモしておきます。



java-serialization



Java標準のserializeを使用して、シリアライズしたデータの登録が
出来るようなので試してみます。


この機能を使用するためには、stores.xmlを編集する必要があります。

%Voldemort%/config/single_node_cluster/config/stores.xml
このファイルを開きます。

デフォルトではこんな感じだと思います。


<stores>
    <store>
        <name>test</name>
        <persistence>bdb</persistence>
        <routing>client</routing>
        <replication-factor>1</replication-factor>
        <required-reads>1</required-reads>
        <required-writes>1</required-writes>
        <key-serializer>
            <type>string</type>
        </key-serializer>
        <value-serializer>
            <type>string</type>
        </value-serializer>
    </store>
</stores>




value-serializerのtypeで、データを保存するときの形式を指定します。
Javaのシリアライズが使いたいので、以下のように編集します。


<stores>
    <store>
        <name>test</name>
        <persistence>bdb</persistence>
        <routing>client</routing>
        <replication-factor>1</replication-factor>
        <required-reads>1</required-reads>
        <required-writes>1</required-writes>
        <key-serializer>
            <type>string</type>
        </key-serializer>
        <value-serializer>
            <!-- java-serializationに変更 -->
            <type>java-serialization</type>
        </value-serializer>
    </store>
</stores>




設定ファイルを変更したら、Voldemortを再起動します。




登録するデータオブジェクト



登録するオブジェクトを作成しました。
titleとdetailsという二つのフィールドを持つオブジェクトです。
※テストなので、適当です。


■Data.java


package com.fc2.blog68.symfoware.voldemort;

import java.io.Serializable;

public class Data implements Serializable {

    private static final long serialVersionUID = 2496199384883564160L;
    
    public String title;
    public String details;

}




※ちなみに、ちゃんとimplements Serializableしていないと、
登録実行時にこんなエラーが表示されます。


Exception in thread "main" voldemort.serialization.SerializationException: java.io.NotSerializableException: com.fc2.blog68.symfoware.voldemort.Data
    at voldemort.serialization.ObjectSerializer.toBytes(ObjectSerializer.java:47)
    at voldemort.store.serialized.SerializingStore.put(SerializingStore.java:109)
    at voldemort.store.DelegatingStore.put(DelegatingStore.java:68)
    at voldemort.client.DefaultStoreClient.put(DefaultStoreClient.java:208)
    at voldemort.client.DefaultStoreClient.put(DefaultStoreClient.java:193)
    at com.fc2.blog68.symfoware.voldemort.Sample.main(Sample.java:27)
Caused by: java.io.NotSerializableException: com.fc2.blog68.symfoware.voldemort.Data
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at voldemort.serialization.ObjectSerializer.toBytes(ObjectSerializer.java:44)
    ... 5 more






このオブジェクトをVoldemortに登録するソースはこんな感じになります。


package com.fc2.blog68.symfoware.voldemort;

import voldemort.client.ClientConfig;
import voldemort.client.SocketStoreClientFactory;
import voldemort.client.StoreClient;
import voldemort.client.StoreClientFactory;

public class Sample {
    public static void main(String[] args) {
        
        String[] bootstrapUrls = new String[]{"tcp://192.168.1.150:6666"};
        
        ClientConfig cc = new ClientConfig();
        cc.setBootstrapUrls(bootstrapUrls);
        
        StoreClientFactory factory = new SocketStoreClientFactory(cc);
        
        //最初にキーの型、二番目に登録するデータの型を定義する
        StoreClient<String, Data> client = factory.getStoreClient("test");
        
        //登録用のオブジェクトを生成
        Data data = new Data();
        data.title = "日本語タイトル";
        data.details = "日本語の詳細を設定";
        
        //自作のオブジェクトを登録
        client.put("key", data);
        
        //登録したデータを取得し、表示
        data = client.getValue("key");
        System.out.println(data.title);
        System.out.println(data.details);

    }
}






ミソはStoreClientを生成するときで、


StoreClient<[keyのオブジェクト], [valueのオブジェクト]>



という形式で指定してやります。



StoreClient<String, Data>


と宣言することで、
keyにString
valueに作成したcom.fc2.blog68.symfoware.voldemort.Dataオブジェクト
がそれぞれ使用できるようになります。

また、シリアライズはVoldemortが勝手にやってくれるので
プログラム中で意識することはありません。



サンプルを実行してみると・・・

[2010-04-18 11:11:59,426 voldemort.client.DefaultStoreClient] INFO bootstrapping metadata.
日本語タイトル
日本語の詳細を設定





狙い通りの動きになりました。






関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2010/04/22(木) 12:13:59|
  2. Voldemort
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Voldemortのデータにオブジェクトを登録する方法(thrift使用) | ホーム | Debianで動作しているVoldemortをWindows + Javaで操作する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/385-7e2899fb
この記事にトラックバックする(FC2ブログユーザー)