现在的位置: 首页 > 综合 > 正文

fastdb个人使用心得

2018年10月19日 ⁄ 综合 ⁄ 共 1567字 ⁄ 字号 评论关闭

http://blog.csdn.net/_hug_/article/details/7591224

fastDB开始使用的时候,经常会出现程序无缘无故的挂掉,或者频频出现一些操作失败的现象,这些错误信息可以自己加日志获取。让使用的人心惊胆战。毕竟fastDB没有经过专门的商业测试,但是使用fastdb实现进程之间通信是非常方便且快速的,这也是很多人使用它的原因。作者用了很长的时间工程使用和测试,终于探索出一条可行的道路,总结了一些经验和大家分享,希望能给大家带来帮助。

 

1、在工程项目中,主要是用fastdb来实现多进程通信。所以是面向进程来使用fastdb的,而不是面向线程。因此在同一个进程中一个数据库对象只能open一次,下次open之前必须close.也就是说只存在一个open的对象,不允许如使用多线程时候每个线程open一次而不close。

    2、对于fdb等fastdb内存映射文件来说,所以的锁操作是以文件为单位,而不是对每个表都有锁机制。

    3、fastdb多进程锁的机制主要作用在commit上,而不是在open操作上。工程中主要用dbConcurrentUpdate和dbConcurrentRead两中模式,同一时刻,允许一个进程写,多个进程读的操作。当2个以上进程用dbConcurrentUpdate模式open后,做了insert/update等操作后执行commit,在同一时刻只能一个进程commit,谁先抢到谁先执行,后抢的进程就会一直在那里等到机会后再执行。当一个dbConcurrentUpdate和多个dbConcurrentRead进程同时执行时,dbConcurrentRead模式执行select操作后可以随时commit,而不会被dbConcurrentUpdate模式进程或者别的dbConcurrentRead进程干扰,这也是多个进程并行读的精髓所在,但是此时dbConcurrentRead执行select后没有commit之前,dbConcurrentUpdate进程是不可以commit的,必须等待dbConcurrentRea执行commit之后才会执行。总之一句话,同时只能一个进程写,多个进程读。

    4、fastdb在执行open操作时候dbConcurrentUpdate模式每次都会成功,因此可以随心所欲打开内存库,但是dbConcurrentRead模式open是有可能失败的,原因是上一次有进程open后没有执行close操作而异常退出导致,所以处理方法是先用dbConcurrentUpdate模式打开在close,然后在用dbConcurrentRead方式打开就可以了。

5、其它:

Ø 同一张表只能放入一个数据库中,不允许放入多个dbDatabase中。

Ø Register宏只能将所有的表放入默认数据库,REGISETER_IN宏可以将表放入不同数据库文件中。

Ø 程序中dbDatabase用REGISETER_IN注册的表与open的*.fdb文件中表不同时,会导致程序挂掉。

Ø REGISETER_IN宏执行了很多操作,做了很多事情,只可以放入cpp文件中使用,它将表放入对应的数据库中。

Ø dbArray<char> 于char *之间差别:dbArray<char>可以放byte流,比如当中含有\0等字符,char*只能放入字符串;char*可以做为索引列来使用(作为select查询条件),但是dbArray<char>不可以。Char*使用的时候要防止野指针,比如匿名变量(作用域只有一行),这样会使程序挂掉

dbQuery可以用‘,’号分隔,‘。’结束的简单条件,还可以使用dbQueryExpression写一些比较复杂的逻辑语句。

【上篇】
【下篇】

抱歉!评论已关闭.