敏捷开发之利刃—db4o

当你想要快速的开发系统原型,用于演示功能、探索需求、消除风险时,用db4o吧;
当你的程序的数据量不算特别大,而又想最快的提高开发速度时,用db4o吧;
当你不想在程序的可配置信息的存储、解析上花费时间时,用db4o吧;
当你不懂sql也不想学sql时,用db4o吧。

Db4o是对象数据库,有java和.net两个分支。这里没有sql,没有表,一切都是原生对象。官方网站对Db4o的描述是:
•完全原生于Java和.NET
•100% 面向对象, 抛开对象-关系映射
•为嵌入式应用优化
•开源,可以基于GPL协议免费使用

Db4o的使用十分简单,以本地数据库为例子:

(1)打开数据库
IObjectContainer ObjectContainer = Db4oFactory.OpenFile("data.yap");
这句话打开本地数据库data.yap,如果该文件不在,则自动创建数据库文件。
(2)关闭数据库
ObjectContainer.Close();
(3)查询对象
IList<YourClass> rlist = ObjectContainer.Query< YourClass >();
这句话查询数据库中全部的YourClass对象。
Db4o提供了多种对象查询方式,详情可见官方文档。
(4)Activate对象
默认从数据库提取的对象只有一定的深度,更深的被引用的对象为null,为了提取更深的对象,需要Activate已提取的对象:
ObjectContainer.Activate(YourObject, depth)
(4)储存/更新对象
ObjectContainer.Store(YourObject)
如果YourObject不是从数据库中通过查询获得的实例,则将YourObject及它所持有的对象,及持有的持有的……所有可达对象全部储存入数据库。
如果 YourObject是从数据库通过查询获得的实例,则更新YourObject的属性。默认不进行级联更新,你也可以设置级联更新,如:
 Db4objects.Db4o.Db4oFactory.Configure().ObjectClass(typeof(YourClass)).CascadeOnUpdate(true);
(5)删除对象
ObjectContainer.Delete(YourObject)

以上是最基本的操作,很快很敏捷。更多的操作可见官方文档。

我现在用最懒惰的方法在用db4o:设置一个Root Object,其它Objects都挂接在Root Object之下,程序启动时就从数据库中把第一个Root实例提取出来,把要用的对象都Activate出来,数据变动时就Store(ObjectChanged)一下子。

Db4o官方网站:http://www.db4o.com/
面向 Java 开发人员的 db4o 指南: http://www.ibm.com/developerworks/cn/java/jdb4o/
JackyXu 的博客有数篇关于db4o的笔记:http://www.cnblogs.com/JackyXu/
db4o 中的数据库重构: http://www.ibm.com/developerworks/cn/java/j-db4o3.html

posted @ 2008-10-17 09:28 xiaotie 阅读(2533) 评论(27)  编辑 收藏 网摘 所属分类: [语言]CLI(.NET)[语言]Java

  回复  引用  查看    
#1楼2008-10-17 09:36 | clefoo      
和Sqlite差不多啊
  回复  引用  查看    
#2楼2008-10-17 09:36 | clefoo      
配置也不好
  回复  引用  查看    
#3楼2008-10-17 09:38 | clefoo      
做程序可不能只图速度,,。。
  回复  引用  查看    
#4楼[楼主]2008-10-17 09:38 | xiaotie      
@clefoo
比用Sqlite开发效率高很多。

  回复  引用  查看    
#5楼[楼主]2008-10-17 09:39 | xiaotie      
@clefoo
看侧重什么,有的地方侧重速度,有的地方侧重性能,有的地方侧重可靠性,不同的侧重点选择不同的解决方案。

  回复  引用  查看    
#6楼2008-10-17 09:39 | 海边的风      
我想请教下,如果系统升级,变更了数据结构,怎么处理系统的旧数据呢?
  回复  引用  查看    
#7楼2008-10-17 09:41 | 二叉树      
Mark
  回复  引用  查看    
#8楼[楼主]2008-10-17 09:46 | xiaotie      
@海边的风
(1)如果只是添加属性,貌似不需要修改,提取时自动的设为null。
(2)Wrapper、Adapter
(3)貌似将数据全部提取出来进行处理再转存的代码量也不大
《db4o 中的数据库重构》(http://www.ibm.com/developerworks/cn/java/j-db4o3.html" target="_new">http://www.ibm.com/developerworks/cn/java/j-db4o3.html) 这篇讲了重构db4o
db4o有个ObjectManager的GUI管理工具,但不免费,所以我不知道能不能直接修改元数据,理论上一些元数据的修改不难做到。

  回复  引用  查看    
#9楼2008-10-17 09:53 | 海边的风      
呵呵,IBM上的那边文章不错
  回复  引用  查看    
#10楼2008-10-17 10:39 | Q.Lee.lulu      
@clefoo
怎么和sqlite差不多呢,db4o是完全的面向对象的数据库,sqlite和其他常见的例如MS SQL都是关系型的数据库。
db4o和sqlite相同之处就是都是文件型的

  回复  引用    
#11楼2008-10-17 11:04 | 迷惘[未注册用户]
但可惜db4o的许可协议GPL不适合商业开发
  回复  引用    
#12楼2008-10-17 11:14 | delphidoc[未注册用户]
虽说开发方便,但安全性、可靠性以及可维护性都不如关系性数据库,把它做最终的存储总是有点不放心(虽说我现在已经在项目里用到了 ^_^)。
  回复  引用  查看    
#13楼2008-10-17 11:28 | 黑羽飘舞      
一直都很关注db4o,作为系统演示之用的确是个难得的利器,但不适合大数据量应用。
  回复  引用    
#14楼2008-10-17 11:53 | sundayle[未注册用户]
N年来框架不断更新
思想维持不变

  回复  引用  查看    
#15楼2008-10-17 12:03 | Jason Cui      
写着玩的时候很好用,当我真的拿来用的时候遇到了一个问题:Query<>取出来的数据顺序是随机的。即不是保存进去的顺序,也不是按某个字段的顺序。
我想让它按保存进去的顺序取出来,费了半天劲没成功!

  回复  引用  查看    
#16楼2008-10-17 12:49 | overred      
@clefoo
这和Sqlite差远了。。起码sqlite里有sql 。有表。。有事务,还可以limit
感觉db4o 这玩意就是个序列化



  回复  引用  查看    
#17楼[楼主]2008-10-17 14:35 | xiaotie      
@overred
db4o也有事务,有索引。就是没有表,OO开发非常讨厌的东东。

  回复  引用  查看    
#18楼[楼主]2008-10-17 14:35 | xiaotie      
@sundayle
思想也是在缓慢变化的。

  回复  引用  查看    
#19楼2008-10-17 18:36 | Kingthy      
@overred
db4o给我的感觉也是类似于将一个ArrayList对象序列化保存到一个文件上.

  回复  引用  查看    
#20楼2008-10-17 19:46 | overred      
@xiaotie
哦,呵呵,事务一般是类库提供的哈
楼主也可以看看嵌入式数据库系统Berkeley DB

@Kingthy
他不单单是简单的序列化的,还在存储格式等方面上做了处理吧。。。没玩过。。。期待楼主更深的介绍

PS:我感觉sqlite这玩意就挺好使的,麻雀虽小五脏俱全。。。

  回复  引用  查看    
#21楼[楼主]2008-10-18 07:33 | xiaotie      
@overred
Berkeley DB 不好用。
db4o也是麻雀虽小五脏俱全,除了sql,其它数据库有的它差不多都有。随着内存越来越大,以及闪存的应用,在性能上对象数据库可能会不弱于关系数据库。
sqlite处理复杂的数据结构的工作量很大,比如树,而db4o处理这类数据结构就非常简单。此外,sqlite到普通对象之间的映射需要额外的编码,而db4o一句话都不用写。
《企业应用架构模式》把程序分为三种model: transaction script, table model 和 domain model,对于复杂度不高的系统而言,用table model(dataset...)比用domain model(ORM)更实用一些。db4o的好处就是,用它来替代关系数据库,不用进行任何ORM操作,因此大大降低domain model的开发量。这样在小项目,不太复杂的项目,这些domain model不擅长的地方,通过引入db4o,采用domain model的开发时间大幅度降低,比table model还省事。而domain model具备天然的可维护性、可扩展性优势,因此在中小项目中,domain model就胜出了table model。

  回复  引用  查看    
#22楼2008-10-18 17:34 | Jason Cui      
db4o的性能很差,真的。
我写的博客备份软件用它保存文章,一共8000多条,分8个目录,数据库体积280M,取某个目录下的文章列表的时候就慢的要死,死出来放在一个ListBox里要超过1分钟。

  回复  引用  查看    
#23楼[楼主]2008-10-18 21:49 | xiaotie      
@Jason Cui
不是db4o性能差,是你用的差吧。你Activate的过多或者过深或者你对象的粒度设计的太大。

  回复  引用  查看    
#24楼2008-10-18 22:07 | Jason Cui      
我只有一个Category类和Article类,没别的了。
  回复  引用  查看    
#25楼[楼主]2008-10-18 23:27 | xiaotie      
@Jason Cui
粒度太大吧,只取一下列表把全部都Activate出来了。

  回复  引用    
#26楼2008-12-23 15:07 | 于冰[未注册用户]
请教一个问题,我打开了一个文件,取出一些对象之后关闭了这个连接。然后我再次打开文件,把这些对象store回去,结果数据呈现的不是修改的效果,而是刚才的数据被又存了一遍,请问这种情况怎么解决,如何让数据库认出已经在数据库里面存入的东西?每次后续插入的时候再查一遍的话我觉得效率太低了。谢谢!
  回复  引用  查看    
#27楼2008-12-23 17:21 | Jason Cui      
@于冰
建议你不要考虑效率问题。这玩意儿只适合单线程小数据量下的快速开发,不是用来替代sql server的。

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1313218





相关文章:

相关链接: