2008年09月16日

db4o,写小工具更简单的方法

作者 非鱼

第一次看到db4o这个东西还是两年前,那时候只有Java版,现在已经发展到了V7,而且已经有了.net版,而且已经支持.net 3.5和linq。

简单来说,db4o是一个可以让你直接保存对象到硬盘的组件,任何对象都可以直接保存,以简单的方式查询调用,是一个用于替代数据库的组件。如果你的程序需要保存格式化的数据到单一位置,你不再需要定义数据库结构,写SQL语句,还得考虑程序迁移问题,有了db4o,一切变得更简单。

比如你定义一个Article类,然后ar=new Article();然后就可以db.Store(ar);直接把这个Article对象保存到硬盘上,下次要使用的时候,可以直接把这个对象Load起来,不需要数据库,不需要转换和映射,对于数据库管理类程序,节省至少一半的代码。

虽然在官方的文档里说db4o的插入和查询性能比一般的数据库更强大更高效,但是在我的实际使用中发现并不是这么回事,它的查询效率不高。(总共只有不到一万个Article对象,但是比较大,数据库体积200多M,查询一次远远达不到官方说的毫秒级,当然,按ID直接定位某个对象是很快的。)另外,它并不是启动和查询的时候把所有的对象放到内存里,而是只查询出符合条件的ID放入内存,实际使用这个对象的时候再去数据库里取,所以你要一直开着这个db,不能close它。总体来说,它并不是很适合用来在保存大量数据的情况下替代数据库。但是,如果用来替代保存程序配置信息,或者用于某些软件里面保存量不大的数据,(比如我写的博客备份软件,用来备份抓取下来的博客文章),那是相当合适的。

这个组件虽然下载的安装文件很大,但是在.net中实际需要引用的只有一个400多K的dll文件,你需要使用的函数只有十几个,而最常用的,只有四个。

但是,要注意的一点,它默认的使用方法是不支持多线程的,所以不适合用于并发环境下的WEB,而更适用于单人使用的客户端程序,把db声明为全局变量,在程序启动的时候打开数据库,程序关闭的时候关闭数据库,就OK了。当然,它也有并发模式,但是需要在一个独立的地方启动一个Server程序,定义一个IP和端口进行监听,其它的客户端使用TCP的方式连接到这个Server,就可以操作这个数据库,所以,它仍然不适于做WEB,因为虚拟主机是不能启动一个单独的程序的。

对于所有用.net写Windows客户端小程序,而且有些数据需要保存的,该组件属于强烈推荐级别。

BTW:它是免费的。