日期:2014-05-16 浏览次数:20443 次
前一段时间开发了一个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的错误。
?
?