BDB数据库合并工具

前一段时间开发了一个BDB数据库合并的工具,本以为通过BDB自带的DbDump和DbLoad就完美解决了,要上线的时候测试一个致命的Bug:合并后BDB数据的顺序不正确。

 

问题虽然已经解决,但过程却很戏剧化。

1、数据顺序的问题,首先想到的排序类 Comparator ,而且原始库也有这个函数直接使用吧;但BDB自带的DbLoad是不支持设置Comparator类的,因此把DbLoad源码Copy出来,略作修改,命名空间都没有变化。

 

BDB应用中有两种情况下需要用到Comparator

(1) setDuplicateComparator,即设置setSortedDuplicates(true)的情况下,需要同时设置一个比较函数;当允许一个key存放多个value时,将使用这个函数比较多个value的大小;

(2) setBtreeComparator,即设置BTree的比较函数;即不同的key采用BTree进行存储时,将使用这个函数比较不同的key;

 

另外,既然DBConfig支持了Duplicate ,别忘了EnvironmentConfig也要支持Duplicate;

 

2、完成以上修改,在本机测试数据合并后,将数据拷贝到测试服务器上后,启动数据服务,数据加载成功,顺序正确。

在我准备为之庆祝时,却发现程序打包发布到测试服务器上后,怎么执行数据的顺序都不正确???

windows上执行OK,linux执行Error,这可是Java应用,怎么会有这种情况?无奈之下,在应用中增加log输出进行诊断,实在没有思路的情况还有log可以帮忙。果然不负众望,增加的log并没有像预期那样输出。这时候才注意到原来java 打包export时有一个warning(平时warning无非是java文件一些警告,基本是不会注意的),打开一看,“文件名冲突,导致DbLoad这个文件并没有打到新的jar包中(文件名和命名空间都是一样的)”,原来如此。

 

3、作为第三方的数据合并工具,需要跟真正的数据服务环境( Environment )保持完全一致(如支持  Duplicate 、支持Transaction),而且BDB的LogEntry的记录方式会将  Comparator也写入jdb文件中,第三方和Comparator采用不同的类(命名空间和类名不同,方法实现完全相同也不行)将会导致ClassNotFound的错误。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值