eXtreme DB和Berkeley Db作为两款应用最为广泛的实时数据库,在多个领域和行业得到了广泛应用,如:网络设备、消费电子、国防、航空航天、工业控制、轨道交通、能源电力、医疗设备、地理信息、汽车电子、金融实时交易、通信技术、互联网等,eXtremeDB在分散控制系统的现场控制站中得到了成功应用。
与内存数据库eXtreme DB不同,Berkeley Db以源代码开放的形式为用户提供了支持多种语言的API函数供开发者使用,包括c、c++、c#、java等。开发者只需要在工程中包含响应的头文件,就可以和方便的调用API函数进行数据库的相关操作,特别是在嵌入式系统中,其应用成本比eXtremeDB要更低。Berkeley DB可用于管理和操作测点信息,缩短了开发周期,提高了系统的稳定性和可靠性。
Python语言简洁、易读以及可扩展,在国内外逐渐得到了广泛应用,其应用库比较丰富,可与其它高级语言很容易的结合。Python目前的版本号已经到了3.6,本文设计的实时数据库基于的版本为2.4。作为目前的主流编程语言,Berkeley,Db也提供了基于Python的应用模块bsddb。该模块封装了Python语言操作BerkeleyDb的相关函数,在Python开发环境中导入bsddb就可以随时调用BerkeleyDb的相关函数来进行数据的存储与读取等操作。
本文基于Python语言,底层通过Berkeley Db,开发了一套实时数据库系统。该数据库基于客户端/服务器模式,服务器端进行数据库的相关操作,客户端通过TCP/IP协议与服务器进行网络通讯,以向服务器发送已经定义好的命令字的形式,进行数据库的读写、删除等过程。
1 基于Python的数据库操作
BerkeleyDB是一个开源的文件数据库,介于关系数据库与内存数据库之间,使用方式与内存数据库类似,它提供的是一系列直接访问数据库的函数,而不是像关系数据库那样需要网络通讯、SQL解析等步骤。Berkeley DB是一个高性能的,嵌入数据库编程库和C语言、C++、Java、Perl、Python、PHP、TCL以及其他很多语言都有绑定。BerkeleyDB可以保存任意类型的键/值对,而且可以为一个键保存多个数据。Berkeley,DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据,广泛用于各种操作系统,包括大多数Unix类操作系统和Windows操作系统以及实时操作系统。
BerkeleyDb有和Python版本号相对应的bsddb模块,需要注意的是,选择的bsddb模块要和Python的版本号相一致。在安装的时候,该模块会自动识别Python的安装目录,并将文件安装该目录下,以便Python工程的调用。Python操作Berkeley Db最基本的包含以下步骤:
1) 初始化数据库
adb = db.DB()
2) 打开数据源
adb.open(,⋯,)
3) 插入或修改数据库中的数据
adb.put(,⋯,)
4) 关闭数据库
adb.close()
当然这些只是最简单的功能实现,bsddb模块还提供了更为复杂的API函数供Python开发者调用。
2 Python编译平台
任何一个编程语言都需要一个编译执行环境,目前有很多Python开发工具,比如vim、Sublime Text等,本文采用Eclipse+pydev作为Python开发工具,利用Eclipse搭建python执行编译环境。Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。它提供了一个用于开发插件的框架,使创建、集成和使用软件工具更容易。Eclipse是著名的跨平台的自由集成开发环境(IDE)。
最初主要用来Java语言开发,通过安装不同的插件Eclipse可以支持不同的计算机语言,比如C++和Python等开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。Eclipse是一种开放源集成化开发平台,与其他开发平台相比,它最大的优点就是它的插件式体系结构,不同的用户可以根据需求开发出自己的工具组件,并和原有的工具实现无缝的连接,非常灵活,极大提高了开发工具的使用效率。
Eclipse要安装好JAVA,JDK后才能运行,如果JAVAJDK没有安装的话,Eclipse是启动不起来的。下载完以后直接解压缩使用,不需要安装。如果Eclipse搭建python平台的话,需要下载一个pydev插件,这也是Eclipse方便的地方,一个平台利用插件构建不同的开发环境。插件安装好以后,在Eclipse环境下,能够显示如图1所示的Pydev包字样。
3 实时数据库设计
本文设计的实时数据库属于客户端/服务器模式。服务器端运行了Berkeley,DB相关操作,而所有的数据命令都是按照预先设计好的命令字从客户端通过TCP/IP协议和服务器通讯,
客户端的应用通过C++来实现,利用SOCKET编程可实现相关网络功能。服务器端的网络通讯这块,Python提供了专门的网络通讯模块t w i s t e d 。t w i s t e d 是一个用python语言写的事件驱动的网络框架,可以用来实现阻塞、非阻塞,同步、异步网络访问,他支持很多种协议,包括UDP、TCP、TLS和其他应用层协议,比如HTTP、SMTP、NNTM、IRC、XMPP/Jabber等,本文设计的实时数据库主要在服务器端利用的twisted的TCP/UDP协议。利用python开发网络程序所用的语句远少于C++的SOCKET,且其调试也更为简洁、方便。
以增加数据点为例,说明本文设计的实时数据库数据包格式,根据客户端和服务器端的功能码定义,数据头和数据尾固定的数值,由服务器端接收数据包后,结合数据包包长进行容错判断,保证了客户端和服务器通讯的安全可靠。
以查询数据点结构为例,说明本文设计的实时数据库在服务器端接收客户端的请求后,返回给客户端的数据包格式及所占字节大小。
同样数据头和数据尾固定的数值,由客户器端接收数据包后,结合数据包包长进行容错判断,保证了客户端和服务器通讯的安全可靠.
4 结语
本文基于Berkeley Db嵌入式实时数据库,利用Python提供的bsddb模块设计了一种实时数据库系统。基于客户端/服务器(C/S)模式,客户端采用C++语言完成,服务器端采用Python语言完成,网络通讯采用TCP/IP协议。利用Python提供的twisted网络编程模块,能够以简洁的代码实现网络通讯,且功能强大,能够满足绝大部分的应用需求。该实时数据库可实现多个客户端并发访问,下一步的工作是实现浏览器/服务器模式(B/S)。