1

一部のデータにアクセスできません。YCSBを使用して、CassandraやMongoDBなどのさまざまなデータベースと通信しています。

私が実際に変更できる唯一のクラスは、いくつかの挿入と読み取りを行う「Workload」クラスです。データベースから読み取るために使用しているメソッドは、次のクラスにあります。

public void doRead(DB db)
{
    String keyname = buildKeyName(keynum);
    System.out.println(keyname);
    HashSet<String> fields = null;

    if (!readallfields)
    {
        // read a random field
        String fieldname = "field" + fieldchooser.nextString();
        fields = new HashSet<String>();
        fields.add(fieldname);
    }

db.read(table,keyname,fields,new HashMap<String,ByteIterator>());
}

ハッシュマップの内容を読み取れるようにコードを変更しようとしました。db.read行を削除して、次のように置き換えました

HashMap<String, ByteIterator> kv_hashmap = new HashMap<String, ByteIterator>();
db.read(table, keyname, fields, kv_hashmap);

次に、kv_hashmapから読み取ろうとしました。

System.out.println(kv_hashmap.get(fields));

ただし、 db.readはintのみを返します。DBは、私が変更したくないパブリック抽象クラスであり、その目的は、さまざまなデータベースと通信することです。

これはdb.readが呼び出すものです:

public abstract int read(String table, String key, Set<String> fields, HashMap<String,ByteIterator> result);

javadocから引用すると、次のようになります。

成功した場合はゼロ、エラーまたは「見つかりません」の場合はゼロ以外のエラーコード。

kv_hashmapから値を読み取る必要があります。なぜその値にアクセスできないのかわかりません。

4

1 に答える 1

0

DB クラスの実装を調べたところ、javadoc にはさらに次のように書かれています。

 @param result A HashMap of field/value pairs for the result

しかし、次に、BasicDBどのエクステンドも調べましDBた。その本体は、渡されたフィールドを単純に出力します。

私がお勧めするのは、メソッドに渡される実際の具体的なクラスを出力し、そのクラスがメソッドDB内で実際に何をしているかを確認することです。read

System.out.println(Test.class.getName());

次に、表示されているreadクラスのメソッドを見てください。 result(実装と同様に) HashMap に値が設定されてBasicDBいない場合は、何も読み取る必要はありません。

于 2013-02-25T16:05:47.387 に答える