嵌入式数据库——BerkeleyDB之JavaEdition

之前听说嵌入式什么的,就觉得好牛B的,理解比较困难,像我这种小菜鸟真是望尘莫及...

今天有机会接触一款之前被Oracle收购的嵌入式数据库BerkeleyDB,初接触感觉什么数据库阿不一样是存东西嘛,就网上各种找资料看资料,半天下来总算有点眉目了

JE 适合于管理海量的,简单的数据。其中的记录都以简单的键值对保存,即key/value对。由于它操作简单,效率较高,因此受到了广泛的好评。

JE 下载地址:http://www.oracle.com/technology/software/products/berkeley-db/je/index.html 下载相关zip文件 解压之后把lib下jar文件拷贝至工程中即可使用

实例:

	// 数据库环境
	private Environment myDbEnvironment = null;
	// 数据库配置
	private DatabaseConfig dbConfig = null;
	// //数据库游标
	// private Cursor myCursor = null;
	// 数据库对象
	private Database myDatabase = null;
	// 数据库文件名
	private String fileName = "D:\\env";
	// 数据库名称
	private String dbName = "sample";

	/*
	 * 打开当前数据库
	 */
	public void openDatabase() {
		// TODO Auto-generated method stub
		try {
			System.out.println("打开数据库: " + dbName);
			EnvironmentConfig envConfig = new EnvironmentConfig();
			envConfig.setAllowCreate(true);// 如果不存在则创建一个
			envConfig.setTransactional(true);
			// envConfig.setReadOnly(false);
			// envConfig.setTxnTimeout(10000, TimeUnit.MILLISECONDS);
			// envConfig.setLockTimeout(10000, TimeUnit.MILLISECONDS);

			// 打开一个环境
			File file = new File(fileName);
			if (!file.exists())
				file.mkdirs();
			myDbEnvironment = new Environment(file, envConfig);

			dbConfig = new DatabaseConfig();
			dbConfig.setAllowCreate(true);// 如果数据库不存在则创建一个
			dbConfig.setTransactional(true);
			// dbConfig.setReadOnly(false);

			if (myDatabase == null)
				myDatabase = myDbEnvironment.openDatabase(null, dbName,
						dbConfig);

			// System.out.println(dbName + "数据库中的数据个数: " + myDatabase.count());
			// 取得数据库的名称
			// System.out.println("数据库名称:"+myDatabase.getDatabaseName());
			// Environment theEnv = myDatabase.getEnvironment();//
			// 取得包含这个database的环境信息

			// theEnv.getDatabaseNames(); // 返回当前环境下的数据库列表
			// theEnv.removeDatabase(); //删除当前环境中指定的数据库

			// theEnv.renameDatabase(null, null, null); // 给当前环境下的数据库改名

			// theEnv.truncateDatabase(null,"dbName",true);
			// //清空database内的所有数据,返回清空了多少条记录。
		} catch (DatabaseException e) {
			System.out.println(e.getMessage());
		}
	}

	/*
	 * 向数据库中写入记录 传入key和value
	 */
	public boolean writeToDatabase(String key, String value, boolean isOverwrite) {
		// TODO Auto-generated method stub
		try {
			// 设置key/value,注意DatabaseEntry内使用的是bytes数组
			DatabaseEntry theKey = new DatabaseEntry(key.trim().getBytes(
					"UTF-8"));
			DatabaseEntry theData = new DatabaseEntry(value.getBytes("UTF-8"));
			OperationStatus res = null;
			// Transaction txn = null;
			try {
				// TransactionConfig txConfig = new TransactionConfig();
				// txConfig.setSerializableIsolation(true);
				// txn = myDbEnvironment.beginTransaction(null, txConfig);
				if (isOverwrite) {
					res = myDatabase.put(null, theKey, theData);
				} else {
					res = myDatabase.putNoOverwrite(null, theKey, theData);
				}
				// txn.commit();
				if (res == OperationStatus.SUCCESS) {
					System.out.println("向数据库" + dbName + "中写入:" + key + ","
							+ value);
					return true;
				} else if (res == 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异常");
				System.out.println(lockConflict.getMessage());
				System.out.println(lockConflict.getCause().toString());
				System.out.println(lockConflict.getStackTrace().toString());
				return false;
			}
		} catch (Exception e) {
			// 错误处理
			System.out.println("向数据库" + dbName + "中写入:" + key + "," + value
					+ "出现错误");
			return false;
		}
	}

	/*
	 * 从数据库中读出数据 传入key 返回value
	 */
	public String readFromDatabase(String key) {
		// TODO Auto-generated method stub
		// Database.getSearchBoth()
		try {
			DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8"));
			DatabaseEntry theData = new DatabaseEntry();
			Transaction txn = null;
			try {
				TransactionConfig txConfig = new TransactionConfig();
				txConfig.setSerializableIsolation(true);
				txn = myDbEnvironment.beginTransaction(null, txConfig);
				OperationStatus res = myDatabase.get(txn, theKey, theData,
						LockMode.DEFAULT);
				txn.commit();
				if (res == OperationStatus.SUCCESS) {
					byte[] retData = theData.getData();
					String foundData = new String(retData, "UTF-8");
					System.out.println("从数据库" + dbName + "中读取:" + key + ","
							+ foundData);
					return foundData;
				} else {
					System.out
							.println("No record found for key '" + key + "'.");
					return "";
				}
			} catch (LockConflictException lockConflict) {
				txn.abort();
				System.out.println("从数据库" + dbName + "中读取:" + key + "出现lock异常");
				System.out.println(lockConflict.getMessage());
				System.out.println(lockConflict.getCause().toString());
				System.out.println(lockConflict.getStackTrace().toString());

				return "";
			}

		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			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.myDbEnvironment.beginTransaction(null, null);
			CursorConfig cc = new CursorConfig();
			cc.setReadCommitted(true);
			if (myCursor == null)
				myCursor = myDatabase.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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (Exception e) {
			System.out.println("getEveryItem处理出现异常");
			System.out.println(e.getMessage().toString());
			System.out.println(e.getCause().toString());

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

	/**
	 * 关闭数据库以及环境
	 */
	public void closeDatabase() {
		try {
			if (myDatabase != null) {
				myDatabase.close();
			}
			if (myDbEnvironment != null) {
				myDbEnvironment.cleanLog();
				myDbEnvironment.close();
			}
		} catch (DatabaseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值