python中使用berkeley db的经验总结
2013-08-25 17:56
615 查看
http://blog.chinaunix.net/uid-23145525-id-3499930.html
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的示例:
dbenv = bsddb.db.DBEnv()
dbenv.open(file_path,
bsddb.db.DB_CREATE
|bsddb.db.DB_INIT_CDB|
bsddb.db.DB_INIT_MPOOL)
db = bsddb.db.DB(dbenv)
filename = file_path
+
'/'+
'tag.db'
db.open(filename,
bsddb.db.DB_BTREE,
bsddb.db.DB_CREATE,
0660)
db['test_key1']
=
'test_data1'
db['test_key2']
=
'test_data2'
db.sync()
db.close()
dbenv.close()
注意:writer进程中必须要声明bsddb.db.DB_INIT_CDB
该变量是并发访问时必须加上的,详情可参见:http://docs.oracle.com/cd/E17076_02/html/programmer_reference/cam.html
reader的示例代码:
ddb.db.DBEnv()
dbenv.open(file_path,
bsddb.db.DB_CREATE
|bsddb.db.DB_INIT_MPOOL)
db = bsddb.db.DB(dbenv)
filename = file_path
+
'/'+
'tag.db'
db.open(filename,
bsddb.db.DB_BTREE,
bsddb.db.DB_RDONLY,
0660)
print db.get('test_key1')
print db.get('test_key2')
cur=db.cursor()
cur.set_range(prefix+'metadatatag')
firstTag = cur.next()
db.close()
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
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的示例:
dbenv = bsddb.db.DBEnv()
dbenv.open(file_path,
bsddb.db.DB_CREATE
|bsddb.db.DB_INIT_CDB|
bsddb.db.DB_INIT_MPOOL)
db = bsddb.db.DB(dbenv)
filename = file_path
+
'/'+
'tag.db'
db.open(filename,
bsddb.db.DB_BTREE,
bsddb.db.DB_CREATE,
0660)
db['test_key1']
=
'test_data1'
db['test_key2']
=
'test_data2'
db.sync()
db.close()
dbenv.close()
注意:writer进程中必须要声明bsddb.db.DB_INIT_CDB
该变量是并发访问时必须加上的,详情可参见:http://docs.oracle.com/cd/E17076_02/html/programmer_reference/cam.html
reader的示例代码:
ddb.db.DBEnv()
dbenv.open(file_path,
bsddb.db.DB_CREATE
|bsddb.db.DB_INIT_MPOOL)
db = bsddb.db.DB(dbenv)
filename = file_path
+
'/'+
'tag.db'
db.open(filename,
bsddb.db.DB_BTREE,
bsddb.db.DB_RDONLY,
0660)
print db.get('test_key1')
print db.get('test_key2')
cur=db.cursor()
cur.set_range(prefix+'metadatatag')
firstTag = cur.next()
db.close()
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.htmlpython_使用Berkeley DB数据库
http://blog.csdn.net/xiaocaiju/article/details/6992043python模块之bsddb: bdb高性能嵌入式数据库 1.基础知识
http://blog.csdn.net/zhaoweikid/article/details/1665741
相关文章推荐
- 使用Docker部署Python应用的一些经验总结
- python功能使用经验总结
- 好用的Python编辑器WingIDE的使用经验总结
- Berkeley DB 使用经验总结
- 好用的Python编辑器WingIDE的使用经验总结
- 使用Docker部署Python应用的一些经验总结
- 使用 Docker 部署 Python 应用的一些经验总结
- Berkeley DB 使用经验总结
- 新浪研发中心: Berkeley DB 使用经验总结
- JS-requireJS中使用UEditor的经验总结
- Python使用总结
- IIS中使用ASP.NET MVC的经验总结
- python 模块rtcclient 使用经验分享
- JTree用法及JTree使用经验总结
- JAXB使用经验总结
- python采用pika库使用rabbitmq总结,多篇笔记和示例
- 总结ThinkPHP使用技巧经验分享(二)
- MyEclipse使用经验总结
- (转)基于Metronic的Bootstrap开发框架经验总结(3)--下拉列表Select2插件的使用
- C++STL容器使用经验总结