zoukankan      html  css  js  c++  java
  • JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构

    一、简介

      JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构

    二、依赖

            <!-- https://mvnrepository.com/artifact/org.fusesource.leveldbjni/leveldbjni-all -->
            <dependency>
                <groupId>org.fusesource.leveldbjni</groupId>
                <artifactId>leveldbjni-all</artifactId>
                <version>1.8</version>
            </dependency>

    三、代码

    package com.dearcloud.utils.leveldb;
    
    import lombok.extern.log4j.Log4j2;
    import org.fusesource.leveldbjni.JniDBFactory;
    import org.iq80.leveldb.DB;
    import org.iq80.leveldb.Options;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Map;
    import java.util.Objects;
    import java.util.concurrent.ConcurrentLinkedQueue;
    
    @Log4j2
    public class LeveldbUtils {
        private DB db;
        private File file;
        private Options options;
    
        public LeveldbUtils(File file, Integer cahceSize, Integer blockSize) {
            Objects.requireNonNull(file);
            File[] files = file.listFiles();
            if (files != null && files.length > 0) {
                log.warn("levelDb directory is not empty. file=[{}]", file);
            }
            this.file = file;
            if (blockSize == null) blockSize = 1024 * 1024 * 10;
            if (cahceSize == null) cahceSize = 1024 * 1024 * 20;
            options = new Options();
            options.cacheSize(cahceSize);
            options.blockSize(blockSize);
            options.maxOpenFiles(5);
            options.writeBufferSize(10000000);//单个文件32MB
            reOpenDb();
        }
    
        private void openDb() {
            synchronized (this) {
                boolean isok = false;
                try {
                    JniDBFactory.factory.destroy(file, options);
                    isok = true;
                } catch (Exception ex) {
                    log.warn("levelDb destroy failed. file=[{}]", file);
                }
                try {
                    db = JniDBFactory.factory.open(file, options);
                    isok = isok && true;
                } catch (IOException e) {
                    log.error("levelDb rebuild init failed. file=[{}]", file);
                }
                if (isok)
                    log.info("leveldb rebuild success.");
            }
        }
    
        public synchronized void put(String key, byte[] value) {
            try {
                db.put(JniDBFactory.bytes(key), value);
            } catch (Exception ex) {
                log.warn("[save to localDb] save single item to localDb failed.", ex);
            }
        }
    
        public synchronized void put(ConcurrentLinkedQueue<Map.Entry<byte[], byte[]>> data) {
            for (Map.Entry<byte[], byte[]> datum : data) {
                try {
                    db.put(datum.getKey(), datum.getValue());
                } catch (Exception ex) {
                    log.warn("[save to localDb] save to localDb failed.", ex);
                }
            }
    
        }
    
    
        public synchronized void close() {
            try {
                db.close();
                JniDBFactory.factory.destroy(file, options);
            } catch (IOException e) {
                log.error("[LeveldbUtils]:levelDb close failed.", e);
            }
        }
    
    }
  • 相关阅读:
    XML实例入门2
    XML入门
    XML实例入门1
    C语言复合梯形公式实现定积分
    一些界面库比较以及如何选择界面库
    网络阅读开篇
    vs2008 edit spin 十六进制实现
    jquery操作cookie
    Excel导入到DataTable
    SQL 查找某个字段的首字母
  • 原文地址:https://www.cnblogs.com/songxingzhu/p/10441888.html
Copyright © 2011-2022 走看看