Berkeley DB XML是一种原生的XML数据库,它允许将XML文档内容直接存储在数据库中。
由此,我想可以用它来存储一些简单的、不经常更新的、但是要求快速查询的数据。
我们通过一个简单的例子来说明,如何针对Berkeley DB XML来存储XML文档:
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- from bsddb.db import *
- from dbxml import *
- mgr = XmlManager()
- uc = mgr.createUpdateContext()
- container = mgr.openContainer("demo.dbxml", DB_CREATE)
- filename = 'demo'
- fileContents = """<?xml version="1.0" encoding="UTF-8"?>
- <result>OK</result>
- """
- container.putDocument(filename, fileContents, uc)
在这个例子中,会创建一个名为demo.dbxml的数据库文件。
相应的,我们读取刚刚存储的内容,可以使用:
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- from bsddb.db import *
- from dbxml import *
- mgr = XmlManager()
- container = mgr.openContainer("demo.dbxml")
- container.addAlias("demo")
- qc = mgr.createQueryContext()
- results = mgr.query("collection('demo')/result", qc)
- for value in results:
- document = value.asDocument()
- print document.getName(), "=", value.asString()
在实际应用过程中,发现当大量数据同时插入的时候,会产生类似以下的错误:
Traceback (most recent call last):
File "D:\robots\collection\tag_to_dbxml.py", line 27, in ?
tagdb.savebydbxml(ls[3], [ cate_id , cate_name])
File "D:\robots\collection\mgRobots\mgTags.py", line 49, in savebydbxml
self.container.putDocument(filename, fileContents, self.uc)
File "C:\Python24\Lib\site-packages\dbxml.py", line 259, in putDocument
def putDocument(*args): return _dbxml.XmlContainer_putDocument(*args)
_dbxml.XmlDatabaseError: (5, 'Error: DB_PAGE_NOTFOUND: Requested page not found'
)
后来发现,需要在
container.putDocument(filename, fileContents, uc)
后面增加
container.sync()
究其原因,我想可能是没有同步造成页面文件(或者索引文件)没有生成的原因。不过,发现增加该语句后虽然能够不断增加新的数据,但是几百K的数据写入的速度非常慢。]
使用索性提高性能
正常情况下查询我做的TAGS列表样例数据库的时候,发现查询速度居然在2657.04ms到1443.64ms之间,但是在建立索引之后,居然提高到5.477ms到3.581ms,感觉提升的也太夸张了。
具体操作方法如下(使用dbxml命令行实现):
- dbxml> openContainer tags4house.dbxml
- dbxml> setVerbose 2 2
- dbxml> addIndex "" context unique-node-element-equality-string
- dbxml> query 'collection()/tag[context="a"]/context'
其中:
- 打开数据库文件
- 设置显示处理的过程(这样才能看到运行时间)
- 添加索引,具体可以参考安装后参考文档中的《Chapter 7. Using BDB XML Indices》中的内容;
- 查询
参考书籍
《Getting Started with XQuery》Part1 , Part2