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);
            }
        }
    
    }
  • 相关阅读:
    Google开源框架盒子模型之Android---<FlexboxLayout>(认知篇)
    Android Studio配置中AndroidAnnotations
    Android Studio分包引发的血案(App启动一直黑屏问题)
    Android Studio打包APK过大问题的研究
    Android WebView JS互调案例
    Eclipse版本android 65535解决方案(原理等同android studio现在的分包方式)
    Android MVP + 泛型,实现了友好VP交互及Activity潜在的内存泄露的优化
    mysql数据监控(db.odbc.select[])
    zabbix 默认消息
    zabbix 利用脚本发邮件(mail)
  • 原文地址:https://www.cnblogs.com/songxingzhu/p/10441888.html
Copyright © 2011-2022 走看看