日期:2014-05-16  浏览次数:20425 次

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的错误。

?

?

1 楼 yexingren23 2011-12-29  
By default,JE sorts keys lexicographically, however, an application can optionally support their own sort and comparison functions. Data objects are similarly opaque
structures from the point of view of the storage system. Applications may treat
key/data pairs as objects, using a compact form of Java serialization, or as tuples of primitive values bound to objects. Applications may also create their own objectdata bindings or work directly with byte arrays.
2 楼 yexingren23 2011-12-29  
A database is collection of key/data pairs sharing sort and comparison.
3 楼 yexingren23 2011-12-29  
A collection of databases comprises a database environment.