db4o使用小结

08-06-04 gltbeyond
    

实现一个小项目-- 拼餐计费系统

经历了近3周的反复,由于一开始,对象间更新关联关于复杂,导致set时对象重复存放。究其原因是,对象的关系设计混乱,set时犹如一大串珠子,没有抓住主线。

总结一下:

1. 时刻注意内存中的对象和数据库中的对象是否保持一致。

2. 对象间引用不要过多,避免环状引用。这点在初次设计class时,时常犯的错误,一直想这样关联起来才方便。其实对象间关系越简单越好。

3. 注意对象的List集合属性,在存储是,如果没有自动存入,不妨试试专门对此属性进行set,毕竟List也是个对象?? 我目前是这样解决的。


欢迎提出意见。


项目的源代码已经贴出,供交流学习:

http://www.jdon.com/jivejdon/forum/messageList.shtml?thread=34147&message=23115033#23115033

    

gltbeyond
2008-06-04 21:00

补充:

例如: Diner--Account--Purchase
--Deposit

1. 分析这四个对象,Diner是比较稳定不变的,适合做一串珠子的头。
2. Account中有List purchaseList; List depositList 分别指向Purchase,Deposit. 当给对应diner的account增加purchase后,这个过程应该更新account的对象,进行结算余额等。此时的存储应该这样:set(account); set(purchaseList); 就可以达到目的了。
如果只是set(diner); 没有任何效果,因为diner在内存没有变化,不要指望自动update account.
另外由于List的特点,必须set(purchaseList).

3. 使用db4o , 终于发现内存中的对象原来是这样的。。 进一步学习使用中。
4. db4o适合小项目 。

banq
2008-06-06 10:10

多谢共享。

使用对象数据库,功底就在对象掌握能力上了。

>时刻注意内存中的对象和数据库中的对象是否保持一致。
这个问题很重要,很琐碎,但是要时刻留意,不过框架本身应该能够处理,Hibernate JPA等都封装起来处理得不错,db4o也不应该有差错出现,但是从我个人Jdon框架开发和应用经验来看:无论框架做得如何好,只有自己直接参与内存对象和数据库对象一致,性能才最高,Jdon框架就是走的这条路。

>对象间引用不要过多,避免环状引用。
这才是最重要的,这个现象必须依靠对象的源头OO分析如Evans DDD来解决,而不是在对象设计层面。好的建模分析根本不会导致环状引用,因为现实生活中不存在猫追尾巴的现象。

freebox
2008-06-06 19:01

据本人养猫经验,我养的猫是不追尾巴的,不知其它猫如何。
批量时效果如何?是否需要先载入再更新持久?毕竟有的东西不能都放进缓存。

gltbeyond
2008-06-16 22:14

再次总结下。

1. 这几天折腾db4o更新对象,因为对象设计的较多,在一个事务中ObjectContainer使用了多个,导致第一个ObjectContainer查询出来的对象,随后更改后,在另外一个ObjectContainer。set()时候,发现对象重复存放了! 这其实就是因为ObjectContainer是维持事务的原因。所以同一个请求,同一个事务,务必在一个ObjectContainer下完成。

2. 面向对象的数据库,需要DDD,MDD先行,对对象的理解,对象间关联的管理尤其重要。