2020年(2)
分类: LINUX
2020-12-04 15:59:01
原文地址:fastDB使用过程中遇到的几个问题 作者:Enders_Hu
1、编译fastDB
Linux下运行程序提示:
Incompatibility between headers and library
fastdb会假设绝大多数的Linux版是64-bit,如果你的机子是32-bit的,必须将config.h文件的如下内容注释掉:
// #if !defined(_WIN32) || defined(_WIN64) // most unixes are now 64-bit, while 32-bit windows is still quite popular
// #define LARGE_DATABASE_SUPPORT
// #endif
然后重新编译fastdb,make install。
2、虚拟机下的运行
VirtualBox Linux下调用dbDatabase::open()打开数据库时,出现如下错误提示:
Failed to create database file
而数据库文件却已成功创建到磁盘上,ls命令可见。
跟踪dbDatabase::open()的实现(在dbDatabase.cpp文件内):
int rc = file.open(fileName, databaseName, fileOpenFlags, fileSize, false);
if (rc != dbFile::ok)
{
char msgbuf[64];
file.errorText(rc, msgbuf, sizeof msgbuf);
TRACE_MSG(("File open error: %s\n", msgbuf));
handleError(DatabaseOpenError, "Failed to create database file");
cleanup(status, 8);
return false;
}
显然是调用dbFile::open()时出错,找到UNIX版本的实现,其中有个mmap的操作:
mmapAddr = (char*)mmap(NULL, mmapSize,
(flags & read_only) ? PROT_READ : PROT_READ|PROT_WRITE,
mmap_attr, fd, 0);
其中mmap_attr= MAP_SHARED。
关于mmap文件映射,如果flags设置为MAP_SHARED,则多个进程可共享该文件,一个进程修改了文件,对其他进程而言是可见的。
如果将要映射的文件在虚拟机的共享目录下,则虚拟机进程对该文件的修改,主机进程是无法看见的,类似于NFS文件系统下把文件映射进内存会失败一样,虚拟机的文件系统没有实现跨系统的mmap共享文件机制,mmap却使用了共享标志MAP_SHARED,导致冲突,故而mmap操作失败。
如果将标志改为MAP_PRIVATE,重新编译fastdb源码,再次运行,会看见数据库能正常工作,但数据库文件将无法创建到磁盘上。
如果不想重新编译fastdb源码,可在调用dbDatabase::open()之前设置如下:
dbDatabase db
db.fileOpenFlags = dbFile::ram_file;
这时数据库文件只在内存中创建,不会进行mmap操作。
但是工程应用中需要保存数据库到磁盘,以上两种方法均不可行。解决办法很简单,只要将应用程序复制到share folder以外运行即可,且数据库文件的路径不能是share folder。
3、fastDB浏览器Dbrowse的问题
Dbrowse看到的table各列乱码的问题:
在descrip table的fields时候(TYPE_DESCRIPTOR or CLASS_DESCRIPTOR)使用KEY、RAWKEY、RAWFIELD等关键字描述类成员,改用FIELD关键字可解决这一问题。
class MyTable {
char const *str;
int4 a;
TYPE_DESCRIPTOR((FIELD(str), FIELD(a)));
};