天天看点

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年被 oracle 收购了,现在我们在 oracle 网站上会看到: berkeleydb、berkeleydb xml 和 berkeleydb java edition 这个三个东东。简单的说最开始 berkeleydb 是只有 c 语言版本的,但是 java 也可以使用,只不过需要通过 jni 调用,效率可能有点影响。后来出了 java edition ,用纯 java 实现了一遍,也就是我们看到的 berkeleydb java edition (简称 je )。

je是一个通用的事务保护的,100%纯java(je不作任何jni调用)编写的嵌入式数据库。因此,它为java开发人员提供了安全高效的对任意数据的存储和管理。

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

je官网:

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

1. 大型数据库的支持:它支持从1到数百万级的数据量,数据库的大小限制基本上受限于你的硬件支持。

2. 多线程,多进程支持:je读写操作都可以是多线程,使用记录级锁定为线程应用程序提供高并发性。此外,je使用死锁超时检测的机制来确保不会有两个线程无限期的死锁。je允许多个进程访问同一个db,但在这种情况下, berkeley 只允许一个线程进行写操作,读操作随意。

3. 事务:原子性,可恢复,隔离性。

4. 内存cache:为了减少io操作提高性能,将数据暂存在内存里面。

5. 索引。

database.put(): 向数据库写入数据,如果不支持重复记录,则会覆盖更新key对应的已有记录

database.putnooverwrite():向数据库写入数据,但是如果key已经存在,不会覆盖已有数据(即使数据库支持重复key)

database.putnodupdata():向数据库写入数据(该方法仅用于支持重复key的数据库),如果key和value对应的记录已经存在,那么操作结果是:operationstatus.keyexist

database.get() :检索key对应的记录,如果没有找到,操作结果返回:operationstatus.notfound

database.getsearchboth() :根据key和value 检索数据库记录,如果没有找到,操作结果返回:operationstatus.notfound

跟environment一样,database也可以通过databaseconfig进行配置。

databaseconfig.setallowcreate()

设置当不存在该数据库的时候是否创建一个新的库

databaseconfig.setbtreecomparator()

设置用来决定数据库中记录顺序的排序器

databaseconfig.setduplicatecomparator()

设置用来比较重复数据的排序器

databaseconfig.setsortedduplicates()

设置该数据库是否允许重复的数据

databaseconfig.setexclusivecreate()

设置当存在该数据库的时候是否会打开数据库失败

databaseconfig.setreadonly()

设置数据库是否只读

databaseconfig.settransactional()

设置事务属性

databaseconfig.setdeferredwrite()

设置延迟写属性

databaseconfig.settemporary()

设置该数据库是否为临时数据库(temporary databases)

延迟写数据库

默认情况下,数据库会在操作的时候写入变化到磁盘中,如果你使用了事务,那么将会在事务提交的时候写入变化。但是如果你启用了延迟写配置,数据库不会把变化立即写入,除非1.显式的调用了database.sync()方法;2.缓存满了;3.到达了检查点(checkpoint)。

延迟写可以带来以下两个好处:

1.在多线程情况下,可以减少写操作的瓶颈。

2.可以减少写操作数据库,比如你一条记录你多次修改了它,那只会最后一次的改变会被写入到数据库中。

数据库也可以在延迟写和普通库之间进行转换,比如你要加载很大量的数据到数据库中,明显的延迟写数据库相较于普通数据库有更好的性能,这时你可以在加载大数据的时候设置延迟写,在加载完毕之后一次性的写入到数据库中。然后关闭数据库,再使用普通数据库配置属性打开。

设置databaseconfig.setdeferredwrite(true),可以让数据库变成延迟写数据库。

临时数据库

这是一个很特殊的数据库,打开临时数据库后,你可以像一般的数据库一样对它进行操作,但是在关闭这个数据库后所有的数据将被清除。也就是说临时数据库中的数据不是持久性的。

并且临时数据库内部采用了延迟写,但是这并不意味着临时数据库将不会发生i/o操作,当缓存满的时候,数据库仍然会把数据写入到磁盘上。临时数据库拥有延迟写数据库的所有优点,但是有一点不同于延迟写数据库,它不会在到达检查点的时候进行写入。

设置databaseconfig.settemporary(true),可以让数据库变成延迟写数据库。