存档
Using Oracle Berkeley DB as a NoSQL Data Store
Using Oracle Berkeley DB as a NoSQL Data Store
By Shashank Tiwari
Learn why and how Oracle Berkeley DB can bring NoSQL benefits to your app.
Published February 2011
“NoSQL” is the new popular buzzword among developers, architects and even technology managers. However, despite the term’s newfound popularity, surprisingly there is no universally agreed-upon definition for it.
Generally, any database that isn’t RDBMS, upholds schema-less structures, is generally relaxed on ACID transactions, and promises high availability and support for large data sets in horizontally scaled environments is popularly categorized as a “NoSQL data store”. Given that these common features often seem in direct contrast to those of a good old RDBMS, some people propose non-relational, perhaps shortened as NonRel, as a more appropriate term than NoSQL.
Regardless, while the definitional conflict continues, many have begun to realize the benefits of NoSQL data stores by including them in their application stack. The rest are keeping a close watch and evaluating if NoSQL is right for them.
Oracle Berkeley DB 产品家族介绍
Oracle Berkeley DB最先由加州大学伯克利分校为了移除受到AT&T限制的dbm代码,而从BSD 4.3到4.4时所改写的。经过将近二十年的衍化,目前Oracle Berkeley DB家族已经发展到包含4个独立产品线 – Berkeley DB、Berkeley DB Java 版、Berkeley DB XML和Mobile Server,被应用到行行业业,在全球有超过2亿的部署。
本文将分别介绍Oracle Berkeley DB四大产品线的特点以及应用,希望能对中国市场的新老用户有所启发和帮助。
Berkeley DB XML 多线程添加文档例子
import java.io.File;
import java.util.concurrent.CountDownLatch;
import com.sleepycat.db.Environment;
import com.sleepycat.db.EnvironmentConfig;
import com.sleepycat.db.LockDetectMode;
import com.sleepycat.dbxml.XmlContainer;
import com.sleepycat.dbxml.XmlContainerConfig;
import com.sleepycat.dbxml.XmlDocument;
import com.sleepycat.dbxml.XmlDocumentConfig;
import com.sleepycat.dbxml.XmlException;
import com.sleepycat.dbxml.XmlManager;
import com.sleepycat.dbxml.XmlManagerConfig;
import com.sleepycat.dbxml.XmlQueryContext;
import com.sleepycat.dbxml.XmlResults;
import com.sleepycat.dbxml.XmlTransaction;
import com.sleepycat.dbxml.XmlUpdateContext;
public class DbxmlThreads extends Thread {
public static XmlManager mgr = null;
public static String containerName = "test.dbxml";
public static Environment dbEnv = null;
private static XmlContainer cont = null;
static {
EnvironmentConfig envConf = new EnvironmentConfig();
envConf.setThreaded(true);
envConf.setAllowCreate(true);
envConf.setTransactional(true);
envConf.setInitializeCache(true);
envConf.setInitializeLocking(true);
envConf.setInitializeLogging(true);
envConf.setCacheSize(64 * 1024 * 1024);
envConf.setLockDetectMode(LockDetectMode.DEFAULT);
XmlManagerConfig xmlMgrConfig = new XmlManagerConfig();
xmlMgrConfig.setAdoptEnvironment(true);
File dbHome = new File(".");
try {
dbEnv = new Environment(dbHome, envConf);
mgr = new XmlManager(dbEnv, xmlMgrConfig);
// 创建XmlContainer
if(mgr.existsContainer(containerName)!=0)
mgr.removeContainer(containerName);
XmlContainerConfig containerConf = new XmlContainerConfig();
containerConf.setTransactional(true);
containerConf.setAllowCreate(true);
containerConf.setContainerType(XmlContainer.NodeContainer);
cont = mgr.openContainer(containerName, containerConf);
cont.setAutoIndexing(false);
} catch (Exception e) {
e.printStackTrace();
}
}
private String name;
private CountDownLatch doneSignal;
DbxmlThreads(String name, CountDownLatch doneSignal) {
this.name = name;
this.doneSignal = doneSignal;
}
public void run() {
XmlTransaction txn = null;
try {
String content = "<"+name+">I am "+name+""+name+">";
for (int i = 0; i < 100; i++) {
XmlDocumentConfig dc = new XmlDocumentConfig();
dc.setGenerateName(true);
System.out.println(name+" insert "+i);
txn = mgr.createTransaction();
XmlDocument doc = mgr.createDocument();
doc.setContent(content);
cont.putDocument(txn, doc, dc);
txn.commit();
}
} catch (XmlException e) {
System.out.println("insert error:" + e.getMessage());
} finally {
doneSignal.countDown();
}
}
public static void main(String[] args) throws Exception {
CountDownLatch doneSignal = new CountDownLatch(5);
DbxmlThreads threadA = new DbxmlThreads("A", doneSignal);
DbxmlThreads threadB = new DbxmlThreads("B", doneSignal);
DbxmlThreads threadC = new DbxmlThreads("C", doneSignal);
DbxmlThreads threadD = new DbxmlThreads("D", doneSignal);
DbxmlThreads threadE = new DbxmlThreads("E", doneSignal);
threadA.start();
threadB.start();
threadC.start();
threadD.start();
threadE.start();
doneSignal.await();
XmlQueryContext qc = mgr.createQueryContext();
String query = "collection('"+containerName+"')/A";
XmlResults res = mgr.query(query, qc);
System.out.println("The results size is: "+res.size());
res.delete();
cont.close();
mgr.close();
}
}
欢迎加入Berkeley DB群@LinkedIn
首先祝各位访客新年快乐,虎年富贵吉祥!
Oracle Berkeley DB在LinkedIn.com上的新建了一个群,供全球的相关人士(包括工程师、产品经理、客户等)共同讨论Berkeley DB的话题和业界动态。群地址:http://www.linkedin.com/groups?gid=2131985. 欢迎加入!
Oracle Berkeley DB 中国研发团队
Berkeley DB三大产品收费模式
众所周知,Berkeley DB是开源的,个人用户可以下载做学习、试用。但实际上,Berkeley DB是Oracle的一个产品,也是要收费的。
英文好的同学,可以读一下我们的授权申明:http://www.oracle.com/technology/software/products/berkeley-db/htdocs/licensing.html。
英文不好的同学,我在此可以稍作解释(强调:我的观点仅作参考,Oracle公司拥有最终解释权):
1. Berkeley DB产品家族三大产品(BDB,BDB-JE和BDB-XML)都是采取双license的授权模式,即开源(免费使用)和商用(付费使用)两种模式。
2. 衡量两种授权模式的一个主要区别是 – “redistribute”,意即你是否将自己的应用程序(在你的应用中使用了BDB)发布给第三方,如客户,机构,附属机构,母公司,合作者,中间商,第三方的非营利组织等。 阅读全文…
甲骨文中国(包括Berkeley DB)2010校招日程
2010财年甲骨文(中国)校园招聘大致流程:
校园宣讲 -> 在线申请 -> 在线测试(涵盖:技术、性格、英文等)-> 初步筛选 -> 邀请合格同学on-site 笔试和面试 -> 进一步筛选 -> 发offer
校园宣讲会初步日程(注意:日期及时间请以51job和校园广告为准):
- Oct. 19th Shanghai Tongji Univ. (19:00-21:00)
- Oct. 20th Shenzhen HIT Graduate School (19:00-21:00)
- Oct. 21th Guangzhou Southern China Univ. of Tech. (15:00-17:00)
- Oct. 26th Beijing Tsinghua Univ. (19:00-21:00)
- Oct. 27th Wuhan Huazhong Univ. of Science and Tech. (19:00-21:00)
- Oct. 30th Hangzhou Zhejing Univ. (19:00-21:00)
- Nov. 2nd Suzhou Suzhou Univ. (14:00-16:00)
- Nov. 4th Nanjing Southest Univ.(19:00-21:00)
- Nov. 5th Dalian Dalian Univ. of Tech. (19:00-21:00)
更新!!原计划于Nov. 6th的在线测试,因后台录入部分同学的纸质简历而推迟。新的时间安排:HR给的反馈是定在本周(Nov. 9th这周末或者周末以前),请大家留意Email通知并谅解。
注: BDB的招聘行程(此项会持续更新,期待届时与你见面交流):
- Chao Huang – 校园宣讲,Oct. 19th Shanghai Tongji Univ. (19:00-21:00)
- Eric Wang – 校园宣讲,Oct. 20th Shenzhen HIT Graduate School (19:00-21:00)
今年Oracle会组织在多个城市进行面试,BDB初步决定参加下面4个。各位面试同学的时间地点请以电话通知为准。
- Eric Wang – 面试官,Nov. 17-18,深圳
- Linchun Sun – 面试官,Nov. 19-20,广州
- Chao Huang – 面试官,Nov. 25-27,北京
- Chao Huang – 面试官,Nov. 24-25,上海
采用Berkeley DB XML PHP建立原生XML Web服务器
近十年来,XML应用越发广泛,政府也推出了《基于XML的电子公文格式规范》等标准。那么,在需要XML数据库引擎的情况下,采用原生XML数据库Berkeley DB XML(以下简称BDB XML)取代MySQL(或其它传统DB)做后台数据库是一个更好的选择。
BDB XML是Oracle推出的一款开源原生XML数据库。与传统数据库相比,原生XML数据库的优势有:
1. 可以直接操作XML文件,XML数据无损–在某些场合,无损的数据源意味着法律效力。
2. 原生检索方式,支持XQuery和XPath,符合XML习惯。
3. 性能优化:原生XML数据库会针对XML特点进行各种优化,如插入文档索引、建立节点ID等。
4. 支持相同数据的不同视图。
和其它原生XML数据库相比,BDB XML优势有:
1. 完整的ACID 事务处理、自动恢复、热备份、用于分布式事务的HA支持。
2. 支持XQuery(含XQuery Update)和XPATH。
3. 可以利用其特有的二进制元数据存取大容量二进制对象(非XML数据)。
4. 支持全Unicode字符集,中文存储、查询都不成问题。
5. 提供一套容器和迭代器接口访问和操作查询结果。
6. 提供交互式命令行工具。
阅读全文…
Berkeley DB (中国)2010校园招聘
重要:关于招聘的最新信息,请看:Oracle 2010 校招日程
各位2010届的毕业生同学,你们好!
你喜欢编程,擅长算法吗?你有志于开发数据库内核吗?欢迎你申请加入Berkeley DB全球研发团队。
关于我们及职位要求(见下图):

职位要求
小奖品
大家好!
BDB小礼物 – 若干2GB U盘(带Oracle Logo)
最近留意到我们BDB中国社区算是小有人气了,我们开发人员也十分开心。在此也感谢大家的支持。
我很努力争取到了一些U盘,用来奖励有兴趣为BDB做点事情的朋友。礼物虽不贵重,但希望大家理解,实是我们的一片心意。由于数量有限,先到先得吧。
重在人人参与
BDB的3个产品都是开源的,大家可以下载并研究源代码。有心的开发者,也可以把你自己写的示例程序、文章、使用心得、创意等发给我(chao.huang at oracle dot com)。每个入围的朋友都可以收到我们寄出的小奖品,并且获奖者会在bdbchina blog上公布。
我们鼓励每个人的参与,和大家分享你的才智,共同进步。同时,也期待能出现眼前一亮的创意(idea),实现自己的事业成功。比如,由于BDB的非关系型数据库的特性,它很适合于用作基因测序等方面数据(基因节点,序列图等)的管理、在医疗监控仪器(大型仪器,小型的传感器等)等应用,等等。
最近评论