python中使用berkeley db的总结

2022-04-21 00:00:00 创建 数据 数据库 示例 环境

1.选bdb的理由

业务场景是:1个writer进程,多个reader进程,writer实时写数据到db文件中,其他reader实时读取db

存储结构:key值采用的是以时间戳,可以说是有序的,故采用btree 

bdb的优点正好满足需求:

   (1).直接嵌入应用程序,没有client-server的开销;

   (2).关键还是稳定,对大数据的存储并发访问的稳定口碑很好

   (3).被oracle收购了,相关的文档非常完善,靠谱

2.使用bdb中的注意事项:

    由于bdb中没有database manager 这个东西,在读写db文件中,是通过其api直接调用的,就拿简单的对于简单的1写1读,数据同步、加锁是怎么处理的呢?bdb中采用“ENV”来模拟一个database manager,所有试图访问该db的程序,都应该在使用该环境后,再尝试对db写、读,查找等操作。

 

3.示例

下面是writer的写db的示例:

  

  1.     #打开一个bdb环境
  2.     dbenv = bsddb.db.DBEnv()
  3.     dbenv.open(file_path, bsddb.db.DB_CREATE |bsddb.db.DB_INIT_CDB| bsddb.db.DB_INIT_MPOOL)
  4.     db = bsddb.db.DB(dbenv)
  5.     filename = file_path + '/'+ 'tag.db'
  6.     db.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0660)
  7.     db['test_key1'] = 'test_data1'
  8.     db['test_key2'] = 'test_data2'
  9.     db.sync() 
  10.     db.close()
  11.     dbenv.close()

注意:writer进程中必须要声明bsddb.db.DB_INIT_CDB

该变量是并发访问时必须加上的,详情可参见:http://docs.oracle.com/cd/E17076_02/html/programmer_reference/cam.html

 

reader的示例代码:

  1. ddb.db.DBEnv()
  2. dbenv.open(file_path, bsddb.db.DB_CREATE |bsddb.db.DB_INIT_MPOOL)
  3. db = bsddb.db.DB(dbenv)
  4. filename = file_path + '/'+ 'tag.db'
  5. db.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_RDONLY, 0660)
  6. print db.get('test_key1')
  7. print db.get('test_key2')
  8. cur=db.cursor()
  9. cur.set_range(prefix+'metadatatag')
  10. firstTag = cur.next()
  11. db.close()
  12. dbenv.close()

读者的环境变量中就不用再加bsddb.db.DB_INIT_CDB 了,否则会出现死锁的问题

参考:

python中对bdb api接口移植的参考手册:

http://www.jcea.es/programacion/pybsddb_doc/4.8.4/db.html

 

Berkeley DB Concurrent Data Store Applications

http://docs.oracle.com/cd/E17076_02/html/programmer_reference/cam.html

 

python_使用Berkeley DB数据库

http://blog.csdn.net/xiaocaiju/article/details/6992043

python模块之bsddb: bdb高性能嵌入式数据库 1.基础知识

http://blog.csdn.net/zhaoweikid/article/details/1665741

 

附代码

#!/usr/bin/python
# -*-coding:utf-8 -*-

import os, bsddb

home = "/home/lxf/01/bdb/db_home"
filename = "test.db"
try:
# 创建home目录
os.mkdir(home)
except:
pass

# 创建数据库环境
dbenv = bsddb.db.DBEnv()
# 打开数据库环境
dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
# 创建数据库对象
d = bsddb.db.DB(dbenv)
# 打开数据库, 这里的第二个参数就是指定使用什么数据访问方法
# btree是 bsddb.db.DB_BTREE, hash是bsddb.db.DB_HASH
# queu 是 bsddb.db.DB_QUEUE, recno 是bsddb.db.DB_RECNO
d.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0666)
# 插入一条数据,注意queue和recno的key不能是字符串的,应该是数字
d.put('test1', 'zhaowei')
print d.items()
# 关闭,这时会把数据写回文件
d.close()
dbenv.close()


class bdb(object):
def __init__(self):
home = "word_freq_db" # 数据库存放文件夹
self.filename = "word_freq.db" # 数据库名称
try:
os.mkdir(home) # 创建存放文件夹
except:
pass
self.dbenv = bsddb.db.DBEnv() # 数据库环境对象
self.dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
self.db = bsddb.db.DB(self.dbenv) # 数据库对象
self.db.open(self.filename, bsddb.db.DB_HASH, bsddb.db.DB_CREATE, 0666)

def write_to_db(self, key, value):
self.db.put(key, value);

def read_from_db(self, key):
return self.db.get(key)

# 获取key值列表
def get_db_keys(self):
return self.db.keys()

def delete_data(self, key):
self.db.delete(key)

def fun(self):
record = self.db.cursor().first()
while record:
key = record[0]
value = record[1]
record = self.db.cursor().next()

相关文章