什么是DB4O
“利用表格存储对象,就像是将汽车开回家,然后拆成零件放进车库里,早晨可以再把汽车装配起来。但是人们不禁要问,这是不是泊车的最有效的方法呢。” – Esther Dyson
db4o 是一个开源的纯面向对象数据库引擎,对于 Java 与 .NET 开发者来说都是一个简单易用的对象持久化工具,使用简单。同时,db4o 已经被第三方验证为具有优秀性能的面向对象数据库, 下面的基准测试图对 db4o 和一些传统的持久方案进行了比较。db4o 在这次比较中排名第二,仅仅落后于JDBC。通过图 1 的基准测试结果,值得我们细细品味的是采用 Hibernate/HSQLDB 的方案和 JDBC/HSQLDB 的方案在性能方面有着显著差距,这也证实了业界对 Hibernate 的担忧。而 db4o 的优异性能,让我们相信: 更 OO 并不一定会牺牲性能。
图1. HSQLDB 基准测试
同时,db4o 的一个特点就是无需 DBA 的管理,占用资源很小,这很适合嵌入式应用以及 Cache 应用, 所以自从 db4o 发布以来,迅速吸引了大批用户将 db4o 用于各种各样的嵌入式系统,包括流动软件、医疗设备和实时控制系统。
db4o 由来自加州硅谷的开源数据库公司 db4objects 开发并负责商业运营和支持。db4o 是基于 GPL 协议。db4objects 于 2004 年在 CEO Christof Wittig 的领导下组成,资金背景包括 Mark Leslie 、 Veritas 软件公司 CEO 、 Vinod Khosla ( Sun 公司创始人之一)、 Sun 公司 CEO 在内的硅谷高层投资人组成。毫无疑问,今天 db4objects 公司是硅谷炙手可热的技术创新者之一。
db4o 的目标是提供一个功能强大的,适合嵌入的数据库引擎,可以工作在设备,移动产品,桌面以及服务器等各种平台。
DB4O的特性
- 开源模式。与其他 ODBMS 不同,db4o 为开源软件,通过开源社区的力量驱动开发 db4o 产品。
- 原生数据库。db4o 是 100% 原生的面向对象数据库,直接使用编程语言( Java 或 C# )来操作数据库。程序员无需进行 OR 映射来存储对象,大大节省了程序员在存储数据的开发时间。
- 高性能。图 2为 db4o 官方公布的基准测试数据,db4o 比采用 Hibernate/MySQL 方案在某些测试线路上速度高出 44 倍之多!并且安装简单,仅仅需要 400Kb 左右的 .jar 或 .dll 库文件。在接下来的系列文章中,我们将只关注在 Java 平台的应用,但是实际上 db4o 毫无疑问会很好地在 .NET 平台工作。
图2. db4o 官方基准测试数据
- 易嵌入。使用 db4o 仅需引入 400 多 k 的 jar 文件或是 dll 文件,内存消耗极小。
- 零管理。使用 db4o 无需 DBA,实现零管理。
- 支持多种平台。db4o 支持从 Java 1.1 到 Java 5.0,此外还支持 .NET 、 CompactFramework 、 Mono 等 .NET 平台,也可以运行在 CDC 、 PersonalProfile 、 Symbian 、 Savaje 以及 Zaurus 这种支持反射的 J2ME 方言环境中,还可以运行在 CLDC 、 MIDP 、 RIM/Blackberry 、 Palm OS 这种不支持反射的 J2ME 环境中。
下载和安装
请到 www.db4o.com 下载,建议下载db4o for .NET 3.5, version 7.12+。安装完后在开始菜单db4o选项卡中会看到帮助文档和两个插件(for VS2005和VS2008),根据本机IDE选择安装插件,安装完后会自动集成到IDE中(图 3)。
图3. db4o for VS插件
Demo编写
创建一个数据库
(1)、用VS创建一个控制台项目,引用db4o客户端DLL--Db4objects.Db4o.dll(在db4o安装目录bin下可以找到),在Main函数编写如下代码;
1. static void Main(string[] args)
2. {
3.
4. string _DBPath = "D:\\TestDB.yap";
5. IObjectContainer db = Db4objects.Db4o.Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), _DBPath);
6. //在D盘根目录下创建了一个空的数据库(TestDB.yap),很像文件操作吧,有则打开,没有则建新;
7. db.Close();
8. }
9.
(2)、编写两个待存储用的类(Car和Pilot )
1. public class Pilot
2. {
3. public Pilot(string name, int points){Name = name; Points = points;}
4. public string Name { get; set; }
5. public int Points { get; set; }
6. }
7.
8. public class Car
9. {
10. public Car(string model){ Model = model;}
11. public Pilot Pilot { get; set; }
12. public string Model{get;set; }
13. }
(3)、开始存储、查询、修改、删除对象
1. string _DBPath = "D:\\TestDB.yap";
2. IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), _DBPath);//创建或连接数据库
3. try
4. {
5. //1、新增对象
6. Car car1 = new Car("Ferrari");
7. Pilot pilot1 = new Pilot("Michael Schumacher", 100);
8. car1.Pilot = pilot1;
9. db.Store(car1);//保存对象到数据库
10. Car car2 = new Car("BMW");
11. Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
12. car2.Pilot = pilot2;
13. db.Store(car2);//保存对象到数据库
14. //查询
15. IList<Pilot> pilots = db.Query<Pilot>(typeof(Pilot));
16. // queryByName
17. IList<Pilot> pilots1 = db.Query<Pilot>(delegate(Pilot pilot)
18. {
19. return pilot.Name == "Michael Schumacher";
20. });
21. //Linq 查询
22. IList<Pilot> pilots2 = (from Pilot p in db where p.Name.StartsWith("Micha el") select p).ToList();
23.
24. db.Store(pilot1); //更新
25.
26. db.Delete(pilot1);//删除
27.
28. db.Commit();//提交事务
29. }
30. catch (Exception ex)
31. {
32. db.Rollback();//事务回滚
33. throw ex;
34. }
35. finally
36. {
37. db.Close();//关闭连接
38. }
(4)、利用安装的VS插件查看数据库(工具—>ObjectManage
Enterprise-->Connect),选择数据库路径(D:\TestDB.yap),如下图:
图4. db4o TestDB.yap数据库查看
总结
db4o 因为其开源的理念,以及创新的实现,获得了 Java Pro 2006 读者选择奖。无论从成功案例还是 db4o 本身来看,这款纯面向对象数据库都值得我们关注,从官方论坛反馈情况看,有相当的用户准备把关系型数据库迁移到 db4o 。而最新发布的 7.3 版本,更是把性能再次提升很多,让我们一起分享 db4o 带来的这场面向对象数据库风暴吧。