Berkeley DB 数据库的使用示例,je

Stella981
• 阅读 286

code

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;

import com.sleepycat.je.Cursor;
import com.sleepycat.je.CursorConfig;
import com.sleepycat.je.Database;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.LockConflictException;
import com.sleepycat.je.LockMode;
import com.sleepycat.je.OperationStatus;
import com.sleepycat.je.Transaction;
import com.sleepycat.je.TransactionConfig;

public class BDB {
    // 数据库环境
    private Environment env = null;

    // 数据库
    private final Database frontierDatabase;

    // 数据库名
    private final String dbName;

    public BDB(String homeDirectory,String dbName) {

        // 1、创建EnvironmentConfig
        EnvironmentConfig envConfig = new EnvironmentConfig();
        envConfig.setTransactional(false);
        envConfig.setAllowCreate(true);

        // 2、使用EnvironmentConfig配置Environment
        env = new Environment(new File(homeDirectory), envConfig);

        // 3、创建DatabaseConfig
        DatabaseConfig dbConfig = new DatabaseConfig();
        dbConfig.setTransactional(false);
        dbConfig.setAllowCreate(true);

        // 4、使用Environment与DatabaseConfig打开Database
        frontierDatabase = env.openDatabase(null, dbName, dbConfig);
        this.dbName = dbName;
    }

    /*
     * 向数据库中写入记录,并判断是否可以有重复数据。 传入key和value
     * 若可以有重复数据,则直接使用put()即可,若不能有重复数据,则使用putNoOverwrite()。
     */
    public boolean writeToDatabase(String key, String value, boolean isOverwrite) {
        try {
            // 设置key/value,注意DatabaseEntry内使用的是bytes数组
            DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8"));
            DatabaseEntry theData = new DatabaseEntry(value.getBytes("UTF-8"));
            OperationStatus status = null;
            Transaction txn = null;
            try {
                // 1、Transaction配置
                TransactionConfig txConfig = new TransactionConfig();
                txConfig.setSerializableIsolation(true);
                txn = env.beginTransaction(null, txConfig);
                // 2、写入数据
                if (isOverwrite) {
                    status = frontierDatabase.put(txn, theKey, theData);
                } else {
                    status = frontierDatabase.putNoOverwrite(txn, theKey, theData);
                }
                txn.commit();
                if (status == OperationStatus.SUCCESS) {
//                    System.out.println("向数据库" + dbName + "中写入:" + key + "," + value);
                    return true;
                } else if (status == OperationStatus.KEYEXIST) {
//                    System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "失败,该值已经存在");
                    return false;
                } else {
//                    System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "失败");
                    return false;
                }
            } catch (LockConflictException lockConflict) {
                txn.abort();
                System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "出现lock异常");
                return false;
            }
        } catch (Exception e) {
            // 错误处理
            System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "出现错误");

            return false;
        }
    }

    /*
     * 从数据库中读出数据 传入key 返回value
     */
    public String readFromDatabase(String key) {
        try {
            DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8"));
            DatabaseEntry theData = new DatabaseEntry();
            Transaction txn = null;
            try {
                // 1、配置 Transaction相关信息
                TransactionConfig txConfig = new TransactionConfig();
                txConfig.setSerializableIsolation(true);
                txn = env.beginTransaction(null, txConfig);
                // 2、读取数据
                OperationStatus status = frontierDatabase.get(txn, theKey, theData, LockMode.DEFAULT);
                txn.commit();
                if (status == OperationStatus.SUCCESS) {
                    // 3、将字节转换成String
                    byte[] retData = theData.getData();
                    String value = new String(retData, "UTF-8");
                    System.out.println("从数据库" + dbName + "中读取:" + key + "," + value);
                    return value;
                } else {
                    System.out.println("No record found for key '" + key + "'.");
                    return "";
                }
            } catch (LockConflictException lockConflict) {
                txn.abort();
                System.out.println("从数据库" + dbName + "中读取:" + key + "出现lock异常");
                return "";
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();

            return "";
        }
    }

    /*
     * 遍历数据库中的所有记录,返回list
     */
    public ArrayList<String> getEveryItem() {
        // TODO Auto-generated method stub
        System.out.println("===========遍历数据库" + dbName + "中的所有数据==========");
        Cursor myCursor = null;
        ArrayList<String> resultList = new ArrayList<String>();
        Transaction txn = null;
        try {
            txn = this.env.beginTransaction(null, null);
            CursorConfig cc = new CursorConfig();
            cc.setReadCommitted(true);
            if (myCursor == null)
                myCursor = frontierDatabase.openCursor(txn, cc);
            DatabaseEntry foundKey = new DatabaseEntry();
            DatabaseEntry foundData = new DatabaseEntry();
            // 使用cursor.getPrev方法来遍历游标获取数据
            if (myCursor.getFirst(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
                String theKey = new String(foundKey.getData(), "UTF-8");
                String theData = new String(foundData.getData(), "UTF-8");
                resultList.add(theKey);
                System.out.println("Key | Data : " + theKey + " | " + theData + "");
                while (myCursor.getNext(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
                    theKey = new String(foundKey.getData(), "UTF-8");
                    theData = new String(foundData.getData(), "UTF-8");
                    resultList.add(theKey);
                    System.out.println("Key | Data : " + theKey + " | " + theData + "");
                }
            }
            myCursor.close();
            txn.commit();
            return resultList;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        } catch (Exception e) {
            System.out.println("getEveryItem处理出现异常");

            txn.abort();
            if (myCursor != null) {
                myCursor.close();
            }
            return null;
        }
    }

    /*
     * 根据key值删除数据库中的一条记录
     */
    public boolean deleteFromDatabase(String key) {
        boolean success = false;
        long sleepMillis = 0;
        for (int i = 0; i < 3; i++) {
            if (sleepMillis != 0) {
                try {
                    Thread.sleep(sleepMillis);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                sleepMillis = 0;
            }
            Transaction txn = null;
            try {
                // 1、使用cursor.getPrev方法来遍历游标获取数据
                TransactionConfig txConfig = new TransactionConfig();
                txConfig.setSerializableIsolation(true);
                txn = env.beginTransaction(null, txConfig);
                DatabaseEntry theKey;
                theKey = new DatabaseEntry(key.getBytes("UTF-8"));

                // 2、删除数据 并提交
                OperationStatus res = frontierDatabase.delete(txn, theKey);
                txn.commit();
                if (res == OperationStatus.SUCCESS) {
                    System.out.println("从数据库" + dbName + "中删除:" + key);
                    success = true;
                    return success;
                } else if (res == OperationStatus.KEYEMPTY) {
                    System.out.println("没有从数据库" + dbName + "中找到:" + key + "。无法删除");
                } else {
                    System.out.println("删除操作失败,由于" + res.toString());
                }
                return false;
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                return false;
            } catch (LockConflictException lockConflict) {
                System.out.println("删除操作失败,出现lockConflict异常");
                sleepMillis = 1000;

                continue;
            } finally {
                if (!success) {
                    if (txn != null) {
                        txn.abort();
                    }
                }
            }
        }
        return false;
    }

    public void closeDB() {
        if (frontierDatabase != null) {
            frontierDatabase.close();
        }
        if (env != null) {
            env.close();
        }
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
2年前
Redis进阶应用:Redis+Lua脚本实现符合操作
!(https://oscimg.oschina.net/oscnet/835168748db35a7a20a2e4f148db89ce4f8.png)一、引言Redis是高性能的keyvalue数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充。得益于超
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这