0

私はこのテストを実行しています:

public class LeveldbTest {

@Test
public void test() throws IOException, InterruptedException {
    DBFactory factory = new Iq80DBFactory();

    Options opts = new Options();
    opts.cacheSize(4096);
    opts.compressionType(CompressionType.SNAPPY);
    opts.createIfMissing(true).writeBufferSize(4096);
    final DB db = factory.open(new File("target/leveldb"), opts);
    final AtomicLong counter = new AtomicLong();

    long start = System.currentTimeMillis();
    new Thread() {
        @Override
        public void run() {
            WriteOptions wo = new WriteOptions();
            wo.sync(true);
            while (true) {
                String key = UUID.randomUUID().toString();
                byte[] bytes = key.getBytes();
                System.out.println("putting: " + key);
                db.put(bytes, bytes, wo);
                counter.incrementAndGet();
            }
        }
    }.start();

    new Thread() {
        @Override
        public void run() {
            WriteOptions wo = new WriteOptions();
            ReadOptions ro = new ReadOptions();
            wo.sync(true);
            while (true) {
                DBIterator iterator = db.iterator(ro);
                if (iterator.hasNext()) {
                    Entry<byte[], byte[]> next = iterator.next();
                    byte[] key = next.getKey();
                    System.out.println("deleting: " + new String(key));
                    db.delete(key, wo);
                    counter.incrementAndGet();
                    try {
                        iterator.close();
                    } catch (IOException e) {
                    }
                }
            }
        }
    }.start();

    Thread.sleep(3000);
    System.out.println((double) counter.longValue() / (System.currentTimeMillis() - start));
}
}

キーがキューから削除されることを期待していますが、コンソールでは 1 つの同じキーのみが削除されているようです。

putting: a1ad4662-18c3-4085-af9d-a451dc3279c0
deleting: 004ef0c2-b278-42c6-9c85-4769d93d5b30 <-
putting: 6c4ee31d-2910-4870-acc5-962f9c40a573
deleting: 004ef0c2-b278-42c6-9c85-4769d93d5b30 <-
deleting: 004ef0c2-b278-42c6-9c85-4769d93d5b30 <-
putting: 63e2e438-3849-46e3-9ea0-1165f9356efb
deleting: 004ef0c2-b278-42c6-9c85-4769d93d5b30 <-

API の使い方が間違っていませんか?

4

2 に答える 2

1

削除スレッドで next() を呼び出す前に iterator.seekToFirst() を呼び出すと、期待どおりに動作することがわかりました。問題は、場所をシークしない場合、反復子がどこを指しているかということです。

于 2013-02-26T15:57:23.293 に答える
1

Iterator を使用するときに観察したように、反復する前に seekToFirst または seekToLast を使用して反復子を有効な行にポイントする必要があります。

私はこれを以前に発見しました (難しい方法です)、期待どおりに ISE をスローせず、一貫性のない読み取りを取得するだけです。

于 2013-12-08T22:29:33.373 に答える