Berkeley DB

Berkeley DB基础教程

http://blog.csdn.net/jediael_lu/article/details/27534223

Berkeley DB教程之三:读写数据的几种方法的比较

http://www.micmiu.com/nosql/berkeley/berkeley-write-read-data/

三、一个简单的BDB JE例子

http://blog.csdn.net/ms_x0828/article/details/5506324

Berkeley DB基础教程

2014-05-29 15:21 5209人阅读 评论(2) 收藏 举报

 分类:

H3_NUTCH(19) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

一、Berkeley DB的介绍

(1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的、简单的数据。如Google使用其来保存账户信息,Heritrix用其来保存froniter.

(2)key/value是Berkeley DB用来管理数据的基础,每个key/value对代表一条记录。

(3)Berkeley DB在底层实现采用B树,可以看成能够存储大量数据的HashMap。

(4)它是Oracle公司的一个产品,C++版本最新出现,之后JAVA等版本也陆续出现。它不支持SQL语句,应用程序通过API对数据库进行操作。

以下内容转载至百度文库

Berkeley DB是由美国Sleepycat Software公司开发的一套开放源码的嵌入式数据库的程序库(database library),它为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。Berkeley DB为数据的存取和管理提供了一组简洁的函数调用API接口。

它是一个经典的C-library模式的toolkit,为程序员提供广泛丰富的函数集,是为应用程序开发者提供工业级强度的数据库服务而设计的。其主要特点如下:
    嵌入式(Embedded):它直接链接到应用程序中,与应用程序运行于同样的地址空间中,因此,无论是在网络上不同计算机之间还是在同一台计算机的不同进程之间,数据库操作并不要求进程间通讯。
    Berkeley DB为多种编程语言提供了API接口,其中包括C、C++、Java、Perl、Tcl、Python和PHP,所有的数据库操作都在程序库内部发生。多个进程,或者同一进程的多个线程可同时使用数据库,有如各自单独使用,底层的服务如加锁、事务日志、共享缓冲区管理、内存管理等等都由程序库透明地执行。
    轻便灵活(Portable):它可以运行于几乎所有的UNIX和Linux系统及其变种系统、Windows操作系统以及多种嵌入式实时操作系统之下。它在32位和64位系统上均可运行,已经被好多高端的因特网服务器、台式机、掌上电脑、机顶盒、网络交换机以及其他一些应用领域所采用。一旦Berkeley DB被链接到应用程序中,终端用户一般根本感觉不到有一个数据库系统存在。
    可伸缩(Scalable):这一点表现在很多方面。Database library本身是很精简的(少于300KB的文本空间),但它能够管理规模高达256TB的数据库。它支持高并发度,成千上万个用户可同时操纵同一个数据库。Berkeley DB能以足够小的空间占用量运行于有严格约束的嵌入式系统,也可以在高端服务器上耗用若干GB的内存和若干TB的磁盘空间。

Berkeley DB在嵌入式应用中比关系数据库和面向对象数据库要好,有以下两点原因:    
    (1)因为数据库程序库同应用程序在相同的地址空间中运行,所以数据库操作不需要进程间的通讯。在一台机器的不同进程间或在网络中不同机器间进行进程通讯所花费的开销,要远远大于函数调用的开销;
    (2)因为Berkeley DB对所有操作都使用一组API接口,因此不需要对某种查询语言进行解析,也不用生成执行计划,大大提高了运行效.

BerkeleyDB系统结构

Berkeley DB由五个主要的子系统构成.包括: 存取管理子系统、内存池管理子系统、事务子系统、锁子系统以及日志子系统。其中存取管理子系统作为Berkeley DB数据库进程包内部核心组件,而其他子系统都存在于Berkeley DB数据库进程包的外部。  
    每个子系统支持不同的应用级别。
    1.数据存取子系统
    数据存取(Access Methods)子系统为创建和访问数据库文件提供了多种支持。Berkeley DB提供了以下四种文件存储方法:
   哈希文件、B树、定长记录(队列)和变长记录(基于记录号的简单存储方式),应用程序可以从中选择最适合的文件组织结构。
   程序员创建表时可以使用任意一种结构,并且可以在同一个应用程序中对不同存储类型的文件进行混合操作。
    在没有事务管理的情况下,该子系统中的模块可单独使用,为应用程序提供快速高效的数据存取服务。
   数据存取子系统适用于不需事务只需快速格式文件访问的应用。
    2.内存池管理子系统
    内存池(Memory pool)子系统对Berkeley DB所使用的共享缓冲区进行有效的管理。它允许同时访问数据库的多个进程或者进程的多个线程共享一个高速缓存,负责将修改后的页写回文件和为新调入的页分配内存空间。    它也可以独立于Berkeley DB系统之外,单独被应用程序使用,为其自己的文件和页分配内存空间。内存池管理子系统适用于需要灵活的、面向页的、缓冲的共享文件访问的应用。
    3.事务子系统
    事务(Transaction)子系统为Berkeley DB提供事务管理功能。它允许把一组对数据库的修改看作一个原子单位,这组操作要么全做,要么全不做。在默认的情况下,系统将提供严格的ACID事务属性,但是应用程序可以选择不使用系统所作的隔离保证。该子系统使用两段锁技术和先写日志策略来保证数据库数据的正确性和一致性。    它也可以被应用程序单独使用来对其自身的数据更新进行事务保护。事务子系统适用于需要事务保证数据的修改的应用。
    
    4.锁子系统
    锁(Locking)子系统为Berkeley DB提供锁机制,为系统提供多用户读取和单用户修改同一对象的共享控制。数据存取子系统可利用该子系统获得对页或记录的读写权限;事务子系统利用锁机制来实现多个事务的并发控制。   该子系统也可被应用程序单独采用。锁子系统适用于一个灵活的、快速的、可设置的锁管理器。
    
    5.日志子系统    
    日志(Logging)子系统采用的是先写日志的策略,用于支持事务子系统进行数据恢复,保证数据一致性。它不大可能被应用程序单独使用,只能作为事务子系统的调用模块。    以上几部分构成了整个Berkeley DB数据库系统。各部分的关系如下图所示:
    
    在这个模型中,应用程序直接调用的是数据存取子系统和事务管理子系统,这两个系统进而调用更下层的内存管理子系统、锁子系统和日志子系统。
    
    由于几个子系统相对比较独立,所以应用程序在开始的时候可以指定哪些数据管理服务将被使用。可以全部使用,也可以只用其中的一部分。例如,如果一个应用程序需要支持多用户并发操作,但不需要进行事务管理,那它就可以
只用锁子系统而不用事务。有些应用程序可能需要快速的、单用户、没有事务管理功能的B树存储结构,那么应用程序可以使锁子系统和事务子系统失效,这样就会减少开销。

BerkeleyDB存储功能概述     
    
    Berkeley DB所管理数据的逻辑组织单位是若干个独立或有一定关系的数据库(database),每个数据库由若干记录组成,这些记录全都被表示成(key,value)的形式.    如果把一组相关的(key,value)对也看作一个表的话,那么每一个数据库只允许存放一个table,这一点不同于一般的关系数据库。实际上,在Berkeley DB中所提到的“数据库”,相当于一般关系数据库系统中的表;而“key/data”对相当于关系数据库系统中的行(rows);Berkeley DB不提供关系数据库中列直接访问的功能,而是在“key/data”对中的data项中通过实际应用来封装字段(列)。
    在物理组织上,每一个数据库在创建的时候可以由应用程序根据其数据特点来选择一种合适的存储结构。可供选择的四种文件存储结构分别是:哈希文件、B树、定长记录(队列)和变长记录(基于记录号的简单存储方式)。
    一个物理的文件中可以只存放一个单独的数据库,也可以存放若干相关或不相关的数据库,而且这些数据库可以分别采用除队列之外任意不同的组织方式,以队列组织的数据库只能单独存放于一个文件,不能同其他存储类型混合存放。
    一个文件除了受最大文件长度和存储空间的约束之外,理论上可以存储任意多个数据库。因此系统定位一个数据库通常需要两个参数——“文件名”和“数据库名”,这也是Berkeley DB不同于
一般关系数据库的地方。
   Berkeley DB存储系统为应用程序提供了一系列的接口函数,用于对数据库的管理和操作。其中包括:

(1)数据库的创建、打开、关闭、删除、重命名等,以及对数据的检索和增删改操作;
      (2)提供一些附加的功能,例如读取数据库状态信息、读取所在文件的信息、读取所在数据库环境的信息、清空数据库的内容、数据库的同步备份、版本升级、提示出错信息等等;
      (3)系统还提供了游标机制,用于存取和访问成组的数据,以及对两个或多个相关数据库进行关联和等值连接操作;
      (4)系统还给出了一些接口函数用于对存取策略进行优化配置,比如应用程序可以自己设置B树的排序比较函数、每页中存放key的最少数目,哈希桶的填充因子、哈希函数、哈希表最大长度,队列的最大长度,数据库存放的字节顺序,
底层存储页的大小,内存分配函数,高速缓存的大小,定长记录的大小和填充位,变长记录所用的分隔符等等。

二、Berkeley DB的应用 

1、从官方网站http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.html下载Berkeley DB的安装文件及JAVA开发包。

2、在windows安装Berkeley DB,一直按下一步即可。为开发方便,安装了windows版本,正式运行时应该使用Linux版本。(设置path时出错,需要以管理员身份运行安装程序)。

3、将JAVA开发包中的jar文件放入buildpath中。主要包括je-6.0.11.jar、JEJConsole.jar、epJEJConsole.jar三个包。

测试程序:

[java] view plain copy

  1. package com.ljh.test;
  2. import static org.junit.Assert.*;
  3. import org.junit.Before;
  4. import org.junit.Test;
  5. public class BerkeleyDBUtilTest {
  6. private BerkeleyDBUtil dbUtil = null;
  7. @Before
  8. public void setup() {
  9. dbUtil = new BerkeleyDBUtil("D:/tmp");
  10. }
  11. @Test
  12. public void testWriteToDatabase() {
  13. for (int i = 0; i < 10; i++){
  14. dbUtil.writeToDatabase(i+"", "学生"+i, true);
  15. }
  16. }
  17. @Test
  18. public void testReadFromDatabase() {
  19. String value = dbUtil.readFromDatabase("2");
  20. assertEquals(value, "学生2");
  21. }
  22. @Test
  23. public void testGetEveryItem() {
  24. int size = dbUtil.getEveryItem().size();
  25. assertEquals(size, 10);
  26. }
  27. @Test
  28. public void testDeleteFromDatabase() {
  29. dbUtil.deleteFromDatabase("4");
  30. assertEquals(9, dbUtil.getEveryItem().size());
  31. }
  32. public void cleanup() {
  33. dbUtil.closeDB();
  34. }
  35. }

Berkeley DB的基本操作:

包括以下部分

(1)打开数据库

(2)向数据库写入数据

(3)根据Key值读取某个数据

(4)读取全量数据列表

(5)根据Key值删除某个数据

(6)关闭数据库

注意:由于各个操作可能对应同一个数据库,因此是否需要使用单例模式?

[java] view plain copy

  1. package com.ljh.test;
  2. import java.io.File;
  3. import java.io.UnsupportedEncodingException;
  4. import java.util.ArrayList;
  5. import com.sleepycat.je.Cursor;
  6. import com.sleepycat.je.CursorConfig;
  7. import com.sleepycat.je.Database;
  8. import com.sleepycat.je.DatabaseConfig;
  9. import com.sleepycat.je.DatabaseEntry;
  10. import com.sleepycat.je.Environment;
  11. import com.sleepycat.je.EnvironmentConfig;
  12. import com.sleepycat.je.LockConflictException;
  13. import com.sleepycat.je.LockMode;
  14. import com.sleepycat.je.OperationStatus;
  15. import com.sleepycat.je.Transaction;
  16. import com.sleepycat.je.TransactionConfig;
  17. public class BerkeleyDBUtil {
  18. // 数据库环境
  19. private Environment env = null;
  20. // 数据库
  21. private static Database frontierDatabase = null;
  22. // 数据库名
  23. private static String dbName = "frontier_database";
  24. public BerkeleyDBUtil(String homeDirectory) {
  25. // 1、创建EnvironmentConfig
  26. EnvironmentConfig envConfig = new EnvironmentConfig();
  27. envConfig.setTransactional(true);
  28. envConfig.setAllowCreate(true);
  29. // 2、使用EnvironmentConfig配置Environment
  30. env = new Environment(new File(homeDirectory), envConfig);
  31. // 3、创建DatabaseConfig
  32. DatabaseConfig dbConfig = new DatabaseConfig();
  33. dbConfig.setTransactional(true);
  34. dbConfig.setAllowCreate(true);
  35. // 4、使用Environment与DatabaseConfig打开Database
  36. frontierDatabase = env.openDatabase(null, dbName, dbConfig);
  37. }
  38. /*
  39. * 向数据库中写入记录,并判断是否可以有重复数据。 传入key和value
  40. * 若可以有重复数据,则直接使用put()即可,若不能有重复数据,则使用putNoOverwrite()。
  41. */
  42. public boolean writeToDatabase(String key, String value, boolean isOverwrite) {
  43. try {
  44. // 设置key/value,注意DatabaseEntry内使用的是bytes数组
  45. DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8"));
  46. DatabaseEntry theData = new DatabaseEntry(value.getBytes("UTF-8"));
  47. OperationStatus status = null;
  48. Transaction txn = null;
  49. try {
  50. // 1、Transaction配置
  51. TransactionConfig txConfig = new TransactionConfig();
  52. txConfig.setSerializableIsolation(true);
  53. txn = env.beginTransaction(null, txConfig);
  54. // 2、写入数据
  55. if (isOverwrite) {
  56. status = frontierDatabase.put(txn, theKey, theData);
  57. } else {
  58. status = frontierDatabase.putNoOverwrite(txn, theKey,
  59. theData);
  60. }
  61. txn.commit();
  62. if (status == OperationStatus.SUCCESS) {
  63. System.out.println("向数据库" + dbName + "中写入:" + key + ","
  64. + value);
  65. return true;
  66. } else if (status == OperationStatus.KEYEXIST) {
  67. System.out.println("向数据库" + dbName + "中写入:" + key + ","
  68. + value + "失败,该值已经存在");
  69. return false;
  70. } else {
  71. System.out.println("向数据库" + dbName + "中写入:" + key + ","
  72. + value + "失败");
  73. return false;
  74. }
  75. } catch (LockConflictException lockConflict) {
  76. txn.abort();
  77. System.out.println("向数据库" + dbName + "中写入:" + key + "," + value
  78. + "出现lock异常");
  79. return false;
  80. }
  81. } catch (Exception e) {
  82. // 错误处理
  83. System.out.println("向数据库" + dbName + "中写入:" + key + "," + value
  84. + "出现错误");
  85. return false;
  86. }
  87. }
  88. /*
  89. * 从数据库中读出数据 传入key 返回value
  90. */
  91. public String readFromDatabase(String key) {
  92. try {
  93. DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8"));
  94. DatabaseEntry theData = new DatabaseEntry();
  95. Transaction txn = null;
  96. try {
  97. // 1、配置 Transaction相关信息
  98. TransactionConfig txConfig = new TransactionConfig();
  99. txConfig.setSerializableIsolation(true);
  100. txn = env.beginTransaction(null, txConfig);
  101. // 2、读取数据
  102. OperationStatus status = frontierDatabase.get(txn, theKey,
  103. theData, LockMode.DEFAULT);
  104. txn.commit();
  105. if (status == OperationStatus.SUCCESS) {
  106. // 3、将字节转换成String
  107. byte[] retData = theData.getData();
  108. String value = new String(retData, "UTF-8");
  109. System.out.println("从数据库" + dbName + "中读取:" + key + ","
  110. + value);
  111. return value;
  112. } else {
  113. System.out
  114. .println("No record found for key ‘" + key + "‘.");
  115. return "";
  116. }
  117. } catch (LockConflictException lockConflict) {
  118. txn.abort();
  119. System.out.println("从数据库" + dbName + "中读取:" + key + "出现lock异常");
  120. return "";
  121. }
  122. } catch (UnsupportedEncodingException e) {
  123. e.printStackTrace();
  124. return "";
  125. }
  126. }
  127. /*
  128. * 遍历数据库中的所有记录,返回list
  129. */
  130. public ArrayList<String> getEveryItem() {
  131. // TODO Auto-generated method stub
  132. System.out.println("===========遍历数据库" + dbName + "中的所有数据==========");
  133. Cursor myCursor = null;
  134. ArrayList<String> resultList = new ArrayList<String>();
  135. Transaction txn = null;
  136. try {
  137. txn = this.env.beginTransaction(null, null);
  138. CursorConfig cc = new CursorConfig();
  139. cc.setReadCommitted(true);
  140. if (myCursor == null)
  141. myCursor = frontierDatabase.openCursor(txn, cc);
  142. DatabaseEntry foundKey = new DatabaseEntry();
  143. DatabaseEntry foundData = new DatabaseEntry();
  144. // 使用cursor.getPrev方法来遍历游标获取数据
  145. if (myCursor.getFirst(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
  146. String theKey = new String(foundKey.getData(), "UTF-8");
  147. String theData = new String(foundData.getData(), "UTF-8");
  148. resultList.add(theKey);
  149. System.out.println("Key | Data : " + theKey + " | " + theData
  150. + "");
  151. while (myCursor.getNext(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
  152. theKey = new String(foundKey.getData(), "UTF-8");
  153. theData = new String(foundData.getData(), "UTF-8");
  154. resultList.add(theKey);
  155. System.out.println("Key | Data : " + theKey + " | "
  156. + theData + "");
  157. }
  158. }
  159. myCursor.close();
  160. txn.commit();
  161. return resultList;
  162. } catch (UnsupportedEncodingException e) {
  163. e.printStackTrace();
  164. return null;
  165. } catch (Exception e) {
  166. System.out.println("getEveryItem处理出现异常");
  167. txn.abort();
  168. if (myCursor != null) {
  169. myCursor.close();
  170. }
  171. return null;
  172. }
  173. }
  174. /*
  175. * 根据key值删除数据库中的一条记录
  176. */
  177. public boolean deleteFromDatabase(String key) {
  178. boolean success = false;
  179. long sleepMillis = 0;
  180. for (int i = 0; i < 3; i++) {
  181. if (sleepMillis != 0) {
  182. try {
  183. Thread.sleep(sleepMillis);
  184. } catch (InterruptedException e) {
  185. e.printStackTrace();
  186. }
  187. sleepMillis = 0;
  188. }
  189. Transaction txn = null;
  190. try {
  191. // 1、使用cursor.getPrev方法来遍历游标获取数据
  192. TransactionConfig txConfig = new TransactionConfig();
  193. txConfig.setSerializableIsolation(true);
  194. txn = env.beginTransaction(null, txConfig);
  195. DatabaseEntry theKey;
  196. theKey = new DatabaseEntry(key.getBytes("UTF-8"));
  197. //2、删除数据 并提交
  198. OperationStatus res = frontierDatabase.delete(txn, theKey);
  199. txn.commit();
  200. if (res == OperationStatus.SUCCESS) {
  201. System.out.println("从数据库" + dbName + "中删除:" + key);
  202. success = true;
  203. return success;
  204. } else if (res == OperationStatus.KEYEMPTY) {
  205. System.out.println("没有从数据库" + dbName + "中找到:" + key + "。无法删除");
  206. } else {
  207. System.out.println("删除操作失败,由于" + res.toString());
  208. }
  209. return false;
  210. } catch (UnsupportedEncodingException e) {
  211. e.printStackTrace();
  212. return false;
  213. } catch (LockConflictException lockConflict) {
  214. System.out.println("删除操作失败,出现lockConflict异常");
  215. sleepMillis = 1000;
  216. continue;
  217. } finally {
  218. if (!success) {
  219. if (txn != null) {
  220. txn.abort();
  221. }
  222. }
  223. }
  224. }
  225. return false;
  226. }
  227. public void closeDB() {
  228. if (frontierDatabase != null) {
  229. frontierDatabase.close();
  230. }
  231. if (env != null) {
  232. env.close();
  233. }
  234. }
  235. }
时间: 2024-10-08 10:27:53

Berkeley DB的相关文章

一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子

一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子 最近,由于云计算的发展,数据库技术也从结构式数据库发展到NoSQL数据库,存储模式从结构化的关系存储到现在如火如荼的key/value存储.其中Berkeley DB就是上述过程中的一个比较有代表性的内存数据库产品,数据库的操作是通过程序来实现的,而不是SQL语句.特别是当今数据不断动态增加的过程中,试图 通过数据切割来达到扩充的思路已经行不通了,因为事先不知道客户数据格式,因此服务提供商不可能进行数据切割.而无模式的key/

BDB (Berkeley DB)数据库简单介绍(转载)

近期要使用DBD,于是搜了下相关的资料,先贴个科普性的吧: 转自http://www.javaeye.com/topic/202990 DB综述DB最初开发的目的是以新的HASH訪问算法来取代旧的hsearch函数和大量的dbm实现(如AT&T的dbm,Berkeley的ndbm,GNU项目的gdbm),DB的第一个发行版在1991年出现,当时还包括了B+树数据訪问算法.在1992年,BSD UNIX第4.4发行版中包括了DB1.85版.基本上觉得这是DB的第一个正式版.在1996年中期,Sle

Berkeley DB (VC6.0 编译环境配置)

操作系统:winxp VC环境:VC6.0 必需文件:Berkeley DB安装文件(db-.msi)下载地址http://www.oracle.com/technology/software/products/berkeley-db/index.html 步骤: 1.运行db-4.7.25.msi,安装Berkeley DB 2.Build Berkeley DB 1〉用VC6.0 打开工程 (C:\Program Files\Oracle\Berkeley DB \db-4.7.25\bui

Berkeley DB分布式探索

明天回家就没有网络,今晚就将整个编写过程记录下来.顺带整理思路以解决未能解决的问题. 标题有点托大,想将Berkeley DB做成分布式存储,感觉很高端的样子,实际上就是通过ssh将Berkeley DB备份到其他网络地址上,查询的时候向多台电脑发送查询请求并返回结果,仅此而已.现在属于编写阶段,如果效果好会考虑用来做web项目的数据库也不一定. 还是这个图: 首先是数据来源:数据来源自己产生.现阶段是在本机产生随机数,实际应用是利用socket传数据进来程序. 在插入数据之前首先读取一些配置信

Berkeley DB基础教程

一.Berkeley DB的介绍 (1)Berkeley DB是一个嵌入式数据库,它适合于管理海量的.简单的数据.如Google使用其来保存账户信息,Heritrix用其来保存froniter. (2)key/value是Berkeley DB用来管理数据的基础,每个key/value对代表一条记录. (3)Berkeley DB在底层实现采用B树,可以看成能够存储大量数据的HashMap. (4)它是Oracle公司的一个产品,C++版本最新出现,之后JAVA等版本也陆续出现.它不支持SQL语

berkeley db储存URL队列的简单实现增、删、查

 Berkeley DB(BDB)是一个高效的嵌入式数据库编程库,C语言.C++.Java.Perl.Python.Tcl以及其他很多语言都有其对应的API.Berkeley DB可以保存任意类型的键/值对(Key/Value Pair),而且可以为一个键保存多个数据.Berkeley DB支持让数千的并发线程同时操作数据库,支持最大256TB的数据,广泛用于各种操作系统,其中包括大多数类Unix操作系统.Windows操作系统以及实时操作系统. Berkeley DB在06年被 Oracl

Berkeley DB数据处理

设计一个结构,利用Berkeley DB完成大数据的存储,备份,查询功能. 已有的储备: 1.Berkeley DB的基本操作. 2.数据转存后数据不丢失. 3.过百GB以上数据的存储. 数据流如下,个人称为数据流,具体跟其他术语冲突不在考虑范围. 各部分功能: A:负责将数据存进Berkeley DB,目的是将源数据转换为Berkeley DB能够访问的格式.方便后续使用.由于A的磁盘有限,而且A在源源不断的插入过程中消耗大量的系统资源,同时一旦宕机,后果很严重(或许是处理方法没有找到).同时

Berkeley DB使用SecondKey给数据排序的实现方法

Berkeley DB使用SecondKey给数据排序的 实现方法是本文我们主要要介绍的内容,在做项目的时候用到了nosql数据库BDB,借此机会研究了一下它的用法.它的官方示例和文档比较丰富,感觉比较 容易学习.在开发过程中出现了一个需求,要把数据根据插入时间遍历,个人认为通过第二主键(SecondKey)比较容易实现. 以下是我的基本实现过程: 1.在ValueBean中加入insertTime属性 public class ValueBean{ private String insertT

了解 Oracle Berkeley DB 可以为您的应用程序带来 NoSQL 优势的原因及方式。

将 Oracle Berkeley DB 用作 NoSQL 数据存储 作者:Shashank Tiwari 2011 年 2 月发布 “NoSQL”是在开发人员.架构师甚至技术经理中新流行的一个词汇.尽管这个术语最近很流行,但令人惊讶的是,它并没有一个普遍认可的定义. 通常来说,任何非 RDBMS 且遵循无模式结构的数据库一般都不能完全支持 ACID 事务,并且因高可用性的承诺以及在横向伸缩环境中支持大型数据集而普遍被归类为“NoSQL 数据存储”.鉴于这些共同特征(与传统的 RDBMS 的特征