- 论坛徽章:
- 0
|
20可用积分
最近有个问题比较困扰。在BerkeleyDB中,打开env和db时都指定了DB_AUTO_COMMIT,然后用游标删除数据时没有带DB_TXN,代码如下:
- dbp->cursor(dbp, NULL, &cursorp, 0);
复制代码
然后
- while ((ret = cursorp->c_get(cursorp, &key, &data, DB_NEXT)) == 0)
- {
- if(判断条件)
- {
- cursorp->c_del(cursorp, 0);
- }
- }
复制代码
这样的代码运行时会有报警信息。似乎是说需要txn。用事务的话效率上似乎吃不消,而且会死锁的样子。不知道谁知道该怎么办?
我的需求是这样的,一个线程不断得往数据库里添加数据,每条记录里带个时间信息。每隔一段时间,起一个线程删除时间超过一定值的数据(也就是删除历史的无用的数据)。不知道谁有好的解决办法?
现在我想到的一个变通的办法是先用游标把需要删除的记录的主键都找出来(保存方法就不限了,也可以放在另一个db里),然后遍历这些主键,删除它们。现在还没有试验这种办法行不行。
第一次使用BerkeleyDb,多多指教。 |
最佳答案
查看完整内容
删除时,txn参数用NULL应该是可以的。另外bdb数据量的增加对效率的影响很小,反倒时你这种期望的频繁清除历史的操作会对其它操作竞争锁,而且再你每次真正删除一条记录时可能会引起B+树的平衡调整,可以结合删除标记和索引的方法来查询你的有效数据。
|