berkeley数据库,

  berkeley数据库,

  资料来源:http://blog.sina.com.cn/u/1210195593

  经过两天的工作,我终于翻译了这个该死的环境API。不知道质量怎么样,就贴在这里吧。请告诉我有什么问题。

  本来翻译这个东西的目的是让自己对BDB环境的使用有一个大致的了解,但是现在看来效果并不明显。关于这个该死的东西,需要仔细研究的地方太多了,在没有更熟练的师傅的情况下,用在项目上有点困难。如果看客中有高手,请帮小弟一把。非常感谢!

  好了,现在正式贴为五角坝弓的环境API。可信度:70%,陈述:难以理解。

  概述:

  Berkeleydb环境是一个或多个数据库的封装,包括日志文件和区域文件。区域文件是包含内存池的缓存页面信息的共享内存区域。可移植性:因为只有数据库文件是字节顺序独立的,所以只有它可以在不同字节顺序的机器之间移植。Log只能在词序相同的机器之间移植。区域文件只能在同一台机器之间移植,而且还需要操作系统的版本。

  所谓字节序就是CPU的架构问题,包括:littel-endian和big-endian,也就是传说中的小头大头问题。一般CPU小,也就是说高字节先来;反之,网络是大头,低位字节在前。小机器上的0x23AB在网络上是0xAB23,所以我们在socket通信的时候,有htonl()这样的函数。

  这里有一个管理bdb环境的简单方法:为共享环境的应用程序的环境文件创建一个单独的主路径。这个路径是用户自己定义的,bdb应用根据路径名来寻找。Dbd通常由几个不同的进程或线程共享。一个环境可以包含来自同一个系统的不同路径的资源,程序经常为了执行或其他原因将资源分配给其他路径。然而,通常库文件、共享区域和日志文件将存储在一个路径下的不同文件夹中。

  默认情况下,共享一个db环境的所有程序都相互信任。它们可以像共享一个区域一样访问彼此的数据,并且它们还共享缓冲区空间和锁。几个具有一致性的程序必须共享同一个环境才能同时操作一个库。

  常见功能:

  一、数据库环境操作功能

  1.int DB _ ENV _ create(DB _ ENV * * dbenvp,u _ int 32 _ t flags);

  创建环境句柄。1是bdb环境句柄的地址,包括数据库、日志文件和缓存、锁定、日志和事务子系统。包含在句柄中的管理系统环境的方法也管理子系统和数据库。2使用DB_RPCCLIENT时,创建一个客户端环境,为0时为本地环境。

  2.int DB_ENV- open(DB_ENV *dbenv,char *db_home,u_int32_t flags,int mode);

  打开一个环境。2是环境的home路径,以后所有函数使用的相对路径都是基于这个路径。指定该路径还有其他几种方式:指定DB_HOME的环境变量,在该函数中使用DB _ HOME;写DB_CONFIG文件;使用DB_ENV- set_data_dir系列函数指定环境相关文件的路径。使用此方法时,请记住将DB_USE_ENVIRON或DB_USE_ENVIRON_ROOT添加到标志中。请参考linux系统中的权限表示,如:660、664等。查看模式参数的使用方法。

  有这么多标志,使用多个标志时请按“”。大致分为四类:

  a、启用各子系统的标志

  数据库初始化CDB

  初始化并发数据存储的锁定机制。多读,多写。

  数据库初始化锁

  启用锁定子系统。当多个进程/线程同时读写数据库时,让它们互不干扰。如果所有线程都只读取数据库,就没有必要启用它。启用锁子系统时,通常需要启用死锁检测器,其功能是DB_ENV- lock_detect。

  数据库初始化日志

  使日志子系统能够恢复程序或系统故障的影响。如果日志文件已经存在或被创建,那么未来的日志将直接添加到之前的日志中,而不是被重写。

  数据库初始化工具

  启用共享内存缓存池系统。注意:此标志在任何情况下都必须使用。

  数据库初始化报告

  启用备份(复制)子系统。至少要同时使用DB_INIT_TXN和DB_INIT_LOCK,更不用说DB_INIT_MPOOL标志了。

  数据库初始化TXN

  启用事件子系统。当原子多重操作很重要且需要恢复时,需要启用该子系统。启用此子系统已经包括启用DB_INIT_LOG。

  第二,在系统初始化时决定恢复什么。

  数据库恢复

  在打开环境之前,在环境中执行常规恢复。因为区域将被删除和重建,所以应用程序恢复需要事件子系统,所以应该同时启用DB_CREATE和DB_INIT_TXN标志。即使不需要恢复,设置此标志也不会有任何不利影响。

  数据库恢复致命

  为了在环境中进行灾难恢复,在打开它之前,需要同时启用DB_CREATE和DB_INIT_TXN,原因同上。

  注意:所有dbd恢复进程都必须是单线程的,也就是说,在执行恢复时,只允许一个线程恢复或访问环境。在bdb文档中,建议在打开环境时总是设置DB_CREATE和DB_RECOVER标志。注意:当启用了DB_RECOVER_FATAL或DB_RECOVER,但日志文件不存在时,DB_ENV- open仍返回0,因此需要在恢复操作之前确定所需的日志文件是否存在。如果您需要有关恢复操作的更多信息,请参考db_archive和db_recover。

  第三,使用指定环境路径的扩展函数相关标志。

  数据库使用环境

  使用这个标志后,bdb文件命名扩展函数就很有用了。

  数据库使用环境根

  使用此标志后,某些与dbd文件命名扩展函数指定的环境相关的文件路径只能由root访问。

  四、其他一些迹象

  数据库_创建

  允许bdb环境的子系统创建任何必要的文件。

  数据库锁定

  映射到内存的共享dbd环境文件和数据库。

  数据库_私有

  在堆中分配区域空间,而不是在文件系统的系统共享内存或备用内存中。带有这个标志的环境的所有相关数据都会在每个进程的内存区分配空间,互斥只存在于每个线程之间。因此,环境此时只允许单进程操作,但允许多线程。

  DB _寄存器

  检查进程使用环境时是否有错误。如果由于某种原因需要恢复,但没有设置DB_RECOVER等相关标志,那么DB_ENV- open将返回DB_RUNRECOVERY的错误号。

  MEM数据库系统

  区域空间分配在共享内存区域,而不是文件系统的备用内存或堆中。请参见文档中的共享内存区域一节。

  数据库线程

  允许地址空间中的多线程并发。

  3.int DB_ENV- close(DB_ENV *dbenv,u _ int 32 _ t flags);

  关闭环境及其所有子系统句柄,同时释放所有分配的内存资源。环境句柄应该在环境中的其他句柄(DB、DBC、DB_TXN、DB_LOGC和DB_MPOOLFILE)关闭后关闭。关闭时,参数1包含的数据库信息将被丢弃,参数2一般为0。

  如果DB_ENV- open()时进程锁(DB_INIT_LOCK)被启用,关闭环境操作不会释放仍然有效的进程锁,用户可以调用DB_ENV- lock_vec来处理;如果启用DB_INIT_MPOOL,关闭操作将关闭所有打开的内存池文件(调用DB_MPOOLFILE- close),但不会处理同步问题(DB _ m poolfile-sync););如果启用了DB_INIT_TXN,则在关闭操作中将忽略所有未处理的事件。但是需要注意的是,如果在关机操作过程中仍然有未处理的事件,那么这本身就是一个错误。如果日志游标被调用(DB_ENV- log_cursor)且未被关闭,则需要自己处理。

  操作成功返回0,但即使操作不成功,也无法再正常访问环境句柄。

  4.int DB_ENV- remove(DB_ENV *dbenv,char *db_home,u _ int 32 _ t flags);

  破坏当前未使用的环境。删除所有相关的备份文件和环境区域,而保留日志文件、数据库文件和环境路径。如果当前环境还在使用,需要指定DB_ENV- FORCE标志,所有已经进入环境区域的进程都会照常运行,但是新加入环境的动作会失败。一般情况下,环境会随着数据库恢复而被清除,所以这个功能是不必要的。但是当环境打开时,DB_SYSTEM_MEM被启用,需要调用这个函数来释放分配的共享内存段;另外,互斥结构分配的系统资源也需要通过调用这个函数来释放。在多线程操作中,只允许一个线程执行此操作。

  Db_home用于指定被破坏环境的路径;如果参数3为DB_USE_ENVIRON或DB_USE_ENVIRON_ROOT,则表示环境路径以BDB文件命名命名,引用3为DB_FORCE,只有在应用程序无法关闭或发生死锁时才会出现。

  5.int DB _ ENV-DB remove(DB _ ENV * dbenv,DB_TXN *txnid,const char *file,const char *database,u _ int 32 _ t flags);

  如果没有指定数据库,则删除该环境中与文件相关的所有子系统的信息以及该文件中的所有数据库内容;如果指定,将只删除指定文件中与数据库相关的子系统信息和数据库内容。开放环境句柄中的数据库不能简单地通过DB- remove删除,因为此时环境对数据库有写保护作用。

  如果操作是指定应用程序事件的一部分,参数2是事件句柄;否则,它为空。参数flag可以是0,也可以是DB_AUTO_COMMIT,使操作由事件子系统处理,从而使操作可恢复。当标志为DB_AUTO_COMMIT且参数2为NULL时,事件系统对操作进行写保护,操作无效。

  6.int DB _ ENV-DB rename(DB _ ENV * dbenv,DB_TXN *txnid,const char *file,

  const char *database,const char *newname,u _ int 32 _ t flags);

  重命名数据库。注意事项和参数含义与DB_ENV- dbremove类似。

  7.int DB _ ENV-get _ home(DB _ ENV * dbenv,const char * * homep);

  获取环境的主路径,存储在homep P指向的地址,这个函数可以随时调用。

  8.int DB _ ENV-get _ open _ flags(DB _ ENV * dbenv,u _ int 32 _ t * flagsp);

  获取打开环境时使用的徽标。该功能在环境打开后使用。

  9.int DB _ ENV-fileid _ reset(DB _ ENV * dbenv,const char *file,u _ int 32 _ t flags);

  修改文件id,这将允许在环境中复制数据库文件,然后代替原始文件使用。你可以在程序执行的任何时候调用这个函数,但是注意,所有当前正在使用的物理文件都不能使用这个操作。

  在数据库环境缓存中,所有库都包含唯一标识该库的ID字符串。如果复制了物理数据库文件,但它在同一环境中使用了与新文件和原始文件相同的ID字符串,则会导致数据损坏。该操作为物理文件中的所有表创建一个新的ID字符串。file参数是要创建的新ID字符串的物理文件名;参数flags为0或DB_ENCRYPT(表示文件已经加密)。

  10.int DB _ ENV-lsn _ reset(DB _ ENV * dbenv,const char *file,u _ int 32 _ t flags);

  此操作修改数据库的LSN,这将允许数据库文件从一个事件数据库环境移动到另一个环境。在程序执行的任何时候都可以调用这个函数,但是注意这个函数不能修改正在使用的数据库的LSN。

  事件环境中的数据库页面包含对环境日志文件(LSN日志序列号)的引用。如果不清理LSN,将数据库文件从一个环境复制或移动到另一个环境,然后修改它们的操作将导致数据损坏。LSN的重置应该在复制或移动数据库的操作之前进行。当LSN仍然与旧环境相关联时,这个函数的调用将触发一致性检查。

  file参数是将清除其LSN的文件的物理路径。参数标志可以是0或DB_ENCRYPT。

  11.int DB _ ENV-dbenv _ fail chk(DB _ ENV * dbenv,u _ int 32 _ t flags);

  此函数检查在数据库上操作时是否存在线程或进程,从而导致挂起的锁,或者由挂起的事件引起的事件子系统错误。此操作的调用基于DB_ENV- set_thread_id或DB_ENV- set_isalive。

  如果调用此函数检测到有死锁或挂起事件,操作将释放锁或忽略挂起事件,并报告与释放的锁或忽略的事件相关的进程和线程号。相关信息将被打印到一个特定的输出通道(DB_ENV- set_msgfile)或者被传递到一个应用程序的回调函数(DB_ENV- set_msgcall)。

  当该操作检测到环境恢复需要现有线程时,将返回DB_RUNRECOVERY,此时环境不适合使用。

  需要在调用DB_ENV- open后使用该函数。参数标志通常为0。

  其他四个统计数据被函数省略了,所以必要时可以查看手册。

  二、环境配置功能

  1.int DB _ ENV-set _ alloc(DB _ ENV * dbenv,void *(*app_malloc)(size_t),

  void *(*app_realloc)(void *,size_t),void(* app _ free)(void *);

  为程序使用的环境设置分配和释放内存的功能。BDB有许多接口,通过链接库为程序分配内存空间。比如DBT结构中的flags参数可以是DB _ DBT _马洛克或者DB _ DBT _雷洛克,BDB的很多统计信息函数,比如db-stat,db _ env-lock _ stat,db _ env-log _ archive,db _ env-log _ stat等。另外,程序为链接库分配内存空间的情况只有一种:DB- associate。但是因为链接库的版本可能不一样(主要在WIN NT中),所以我们调用这个函数来避免这个问题。

  您不必为所有3个回调函数参数指定相关函数。但是,您指定的函数将与链接库函数一起使用。考虑到与标准链接库接口的兼容性,您指定的函数必须遵循ANSI C X3.159-1989的调用规则。环境打开后,使用该函数将返回一个EINVAL错误。

  2.int DB _ ENV-set _ app _ dispatch(DB _ ENV * dbenv,

  int (*tx_recover)(DB_ENV *dbenv,DBT *log_rec,DB_LSN *lsn,DB _ recops op));

  当事件失败(中止)时,回调函数被指定用于恢复程序指定的日志记录的动作。应该在打开环境之前调用该函数,否则可能会由于与环境不一致而导致数据损坏。

  回调参数tx_recover的参数:log_rec是日志记录,lsn是日志序列号,op可以是下列标志之一:

  DB _ TXN _向后_滚动

  读取日志判断哪个事件被触发,未完成的操作被终止,撤销日志记录中描述的操作。

  DB _ TXN _前进_滚动

  重做(Redo)由日志记录描述的操作。

  DB _ TXN _中止

  当事件终止时,它会读回日志,并删除日志记录中描述的操作。

  数据库_ TXN _应用

  在复制地址使用日志来重做日志记录中描述的操作。和DB _ TXN _前进_滚动经常指示相同的操作。

  DB _ TXN _打印

  日志以调试所需的格式打印出来。

  3.int DB _ ENV-set _ cachesize(DB _ ENV * dbenv,u_int32_t gbytes,u_int32_t bytes,int n cache);

  设置共享内存池的空间大小,即缓存。缓存的大小应该为程序的一般工作数据加上少量异常事件的额外内存来设置。注意:工作区设置比同步访问的页面大得多。

  的默认缓存大小为256K,设置时至少应为20K。所有小于500M的缓存将自动增加1/4,以测量内存池的过载,所有大于500M的缓存将基于其指定的大小。32位系统最大缓存4G,64位系统最大缓存10T。如果参数ncache为0或1,则在内存中的连续空间中分配缓存;如果它大于1,则高速缓存被分配为与ncache块大小相同的内存。数据库缓存大小也可以在环境的DB_CONFIG文件中配置。语法是:

  Set_cachesize多少g缓存额外空间多少位缓存块

  例如,在DB_CONFIG文件中写入以下语句将创建一个总共500M的缓存空间,分为3个块:

  set_cachesize 0 524288000 3

  应该在打开环境之前调用该函数。如果环境已经打开,此功能将被忽略。

  4.int DB _ ENV-get _ cachesize(DB _ ENV * dbenv,u_int32_t *gbytesp,u_int32_t *bytesp,int * ncachep);

  获取环境缓存的信息。这个函数可以在程序运行的任何时候被调用。

  5.int DB _ ENV-set _ data _ dir(DB _ ENV * dbenv,const char * dir);

  在环境中设置数据库文件路径。调用b-open时指定的路径将基于此路径。数据库将基于第一个指定的路径。如果没有调用这个函数,数据库路径就是环境的主目录。

  类似地,该路径的指定也可以在DB_COFIG中指定,格式如下:

  set_data_dir /usr/local/dbpath

  应该在打开环境之前调用该函数,并且应该在DB_ENV- open中指定DB_USE_ENVIRON标志,以便set_data_dir函数指定的路径生效。

  6.int DB _ ENV-get _ data _ dirs(DB _ ENV * dbenv,const char * * * dirpp);

  该函数返回一个路径数组,其最后一个成员不为空。这个操作可以在程序运行的任何时候调用,如果成功将返回0,如果失败将返回非零值。

  7.int DB _ ENV-set _ encrypt(DB _ ENV * dbenv,const char *passwd,u _ int 32 _ t flags);

  指定用于加密和解密BDB库函数的密码。这个函数不仅配置指定的环境句柄操作,而且实际上配置整个数据库的环境。此操作应在环境打开之前调用,如果环境打开且调用时未与环境同步,将返回错误。标志为0或DB_ENCRYPT_AES,表示使用Rijndael/AES算法进行加密和解密。

  8.int DB _ ENV-get _ encrypt _ flags(DB _ ENV * dbenv,u _ int 32 _ t * flagsp);

  获取加密标志,在程序运行时可以随时调用。如果成功,它将返回0,并将标志存储在flagsp指向的地址中。如果失败,它将返回一个非零值。

  9.int DB _ ENV-set _ feedback(DB _ ENV * dbenv,void(* DB _ feedback _ fcn)(DB _ ENV * dbenv,int opcode,int percent));

  BDB库函数的一些操作可能会占用很多时间,应用程序调用这个函数来管理这些操作的进度。当一个操作可能需要很长时间时,BDB将调用该操作指定的回调函数来处理进程信息。该功能可以在程序运行时随时指定。成功返回0,失败返回非零值。

  回调函数参数:

  对未封闭环境句柄的引用。

  Opcode是操作码,可以是DB_RECOVER,表示环境恢复。

  百分比表示操作已完成的程度,可以是0到100。

  10.int DB _ ENV-set _ flags(DB _ ENV * dbenv,u_int32_t flags,int onoff);

  配置数据库环境。该函数也可以由DB_CONFIG文件表示。为了保持同步,除非另外指定,否则这些标志要么由该函数设置,要么写入DB_CONFIG文件。参数onoff为0,取消标志;1、设置标志。

  参数标志可以是由“”连接的下列几个标志。

  数据库自动提交

  一旦设置了该标志,其中未指定事件句柄并且修改了环境中的数据库的操作将自动链接到该事件。该标志可用于在程序运行的任何时候导入带有set_flags的环境配置。

  CDB大学

  一旦设置了此标志,BDB将锁定整个数据库环境的并发存储操作,而不是环境中的单个数据库。此标志可用于在打开环境之前导入带有set_flags的环境配置。

  直接数据库

  关闭数据库文件的系统缓冲,以避免重复缓存。该标志可用于在程序运行的任何时候导入带有set_flags的环境配置。

  数据库直接日志

  关闭数据库文件的日志文件,避免重复缓存。该标志可用于在程序运行的任何时候导入带有set_flags的环境配置。

  数据库同步数据库

  将BDB配置为在从写入系统调用返回之前刷新对备份磁盘的数据库写入,而不是在单独的系统调用中显式刷新数据库写入。此标志仅在某些系统中有效(例如,支持POSIX标准的O_DYNC标志的系统,以及支持Win32的FILE_FLAG_WRITE_THROUGH标志的系统),可能会导致文件修改时间和其他文件级信息不准确。在大多数系统中,这个符号还会导致运行效率的降低。因此,该标志只适用于容错能力强的文件系统(如Veritas VxFS文件系统)。该标志可用于在程序运行的任何时候导入带有set_flags的环境配置。

  数据库同步日志

  将BDB配置为在从写入系统调用返回之前刷新对备份磁盘的日志写入,而不是在单独的系统调用中显式刷新数据库日志写入。此标志仅在某些系统中有效(例如,支持POSIX标准的O_DYNC标志的系统,以及支持Win32的FILE_FLAG_WRITE_THROUGH标志的系统),可能会导致文件修改时间和其他文件级信息不准确。这个标志在某些系统中导致运行效率下降,但在另一些系统中却导致性能上升。该标志可用于在程序运行的任何时候导入带有set_flags的环境配置。

  数据库日志自动删除

  此标志会自动删除不必要的日志文件,但这将导致无法进行灾难恢复。使用set_flags设置此标志将影响在数据库环境中运行的所有线程。该标志可用于在程序运行的任何时候导入带有set_flags的环境配置。

  数据库日志内存

  此标志将事件日志保存在内存中,而不是磁盘中。这意味着事件支持的是ACI(原子性、一致性、隔离性)而不是D(持久性),也就是说,数据库的完整性会得到维护,但当程序或系统出现问题时,完整性不会得到保留。在这种情况下,必须从可靠的存档备份或复制组主服务器还原所有数据库文件。使用set_flags设置此标志将影响在数据库环境中运行的所有线程。在打开环境之前,可以将此标志导入到环境配置中。

  当为日志分配的内存已满时,BDB将返回一个额外的错误号:DB_LOG_BUFFER_FULL。因此,在配置内存日志的大小时,程序应该确保它足够大,以避免某个事件占用整个日志的内存,并且由于某个事件在日志内存中一直处于活动状态,因此该空间中没有空闲空间。

  DB_NOLOCKING

  这个标志允许所有互斥体被释放,而不管它们的实际角色。注意:只能用于调试!这个标志可以在程序运行的任何时候用set_flags导入环境配置,只作为指定环境的句柄。

  数据库名称映射

  这个标志将把只读数据库复制到本地缓存,而不是映射到进程内存中。此标志可用于在程序运行时随时导入带有set_flags的环境配置,并且仅在指定的环境句柄上起作用。

  DB_NOPANIC

  此标志将忽略数据库环境中的所有紧急状态。注意:只能用于调试!此标志可用于在程序运行时随时导入带有set_flags的环境配置,并且仅在指定的环境句柄上起作用。

  数据库覆盖

  删除前覆盖以加密格式存储的文件。BDB交替使用0xFF、0x00和0xFF字节模式来重写文件。为了使文件重写有效,文件必须存储在固定块文件系统中。具有日志和日志文件系统的系统需要修改BDB源文件。此标志可用于在程序运行时随时导入带有set_flags的环境配置,并且仅在指定的环境句柄上起作用。

  DB _ PANIC _环境

  该标志将系统环境设置为panic状态,该状态下的环境将拒绝任何调用BDB函数的操作,并返回DB_RUNRECOVERY。这个标志不能在DB_CONFIG文件中配置,在环境打开后才会生效,但是环境配置可以在程序运行时随时导入。在整个数据库环境中工作,包括在其上操作的线程。

  数据库区域初始化

  一旦设置了这个标志,当创建或加入一个环境时,BDB将把缺页共享区保存到内存中;此外,BDB会在创建环境时写入共享区,强制虚拟内存和文件系统说明必要的内存和磁盘空间;并避免将来出现磁盘空间不足的错误。该标志可用于在程序运行的任何时候导入带有set_flags的环境配置。

  数据库_时间_未授权

  这个标志导致基于时钟或事件超时值的数据库调用超时回到DB_LOCK_NOTGRANTED,以区分真正死锁返回的DB_LOCK_DEADLOCK。此操作仅适用于指定的环境句柄。

  DB _ TXN _不同步

  Bd不会在事件中提交日志,也不会同步刷新日志。这意味着事件支持ACI(原子性、一致性、隔离性)而不是D(持久性),这意味着数据库的完整性将得到维护,但当程序或系统出错时,一些最频繁触发的事件可能会在恢复操作中被取消。风险的数量取决于有多少日志更新与日志内存匹配、操作系统将脏文件刷新到磁盘以及检查日志的频率。此标志可用于在程序运行时随时导入带有set_flags的环境配置,并且仅在指定的环境句柄上起作用。

  数据库_ TXN _写_不同步

  BDB将在事件触发时写入日志,但不会同步刷新日志。这意味着事件支持ACI(原子性、一致性、隔离性)而不是D(持久性),这意味着数据库的完整性将得到维护,但当程序或系统出错时,一些最频繁触发的事件可能会在恢复操作中被取消。风险的数量取决于有多少日志更新与日志内存匹配、操作系统将脏文件刷新到磁盘以及检查日志的频率。此标志可用于在程序运行时随时导入带有set_flags的环境配置,并且仅在指定的环境句柄上起作用。

  数据库_产量CPU

  在获取每个内存页面或互斥体后,BDB将被立即处理。注意:该标志仅用于压力测试。此标志可用于在程序运行时随时导入带有set_flags的环境配置,并且仅在指定的环境句柄上起作用。

  11.int DB _ ENV-get _ flags(DB _ ENV * dbenv,u _ int 32 _ t * flagsp);

  这个函数可以在程序运行的任何时候被调用,并返回环境配置标志位。

  12.int DB _ ENV-set _ is alive(DB _ ENV * dbenv,int (*is_alive)(DB_ENV *dbenv,pid_t pid,DB _ threadid _ t tid));

  声明一个函数来确定线程或进程是否仍在运行。此标志可用于在程序运行时随时导入带有set_flags的环境配置,并且仅在指定的环境句柄上起作用。回调函数参数:

  dbenv环境的句柄。

  DB_ENV- set_thread_id函数指定的进程的ID。

  由tid _ env-set _ thread _ id函数指定的线程ID。

  13.int DB _ ENV-set _ panic call(DB _ ENV * dbenv,void(* DB _ panic _ fcn)(DB _ ENV * dbenv,int errval));

  当应用程序只能被BDB库关闭和恢复时,该函数将返回DB_RUNRECOVERY。一般来说,程序会直接退出,而不是返回错误代码。此函数指定当DB_RUNRECOVERY将被返回时要调用的函数。该标志可用于在程序运行的任何时候导入带有set_flags的环境配置。

  14.int DB _ ENV-set _ RPC _ server(DB _ ENV * dbenv,CLIENT *client,char *host,

  long cl_timeout,long sv_timeout,u_int32_t标志);

  在数据库环境和远程过程通信(RPC)服务器之间建立连接。调用此函数后,以后对BDB库接口的调用可能会返回或抛出包含DB_NOSERVER、DB_NOSERVER_ID或DB_NOSERVER_HOME的异常。它只在指定的环境句柄上工作,但不包括库环境上的相关操作。环境打开后,不能调用该函数。

  参数:如果函数中提供了客户端的路径,DBD会将其作为连接,并忽略host和cl_timeout参数。参数cl_timeout:指定客户端等待服务器的延迟时间;当它为0时,将使用默认的延迟时间;如果超时,将返回DB_NOSERVER。参数host指定BDB服务器为创建联系通道而连接到的主机。参数标志为0。参数sv_timeout指定服务器允许客户端空闲的时间;一旦达到延迟时间,服务器将释放与客户端相关的所有资源。此后,客户端连接服务器的尝试会返回DB_NOSERVER_ID,表示它给了服务器一个无用的标志;注意:该值仅供服务器参考,服务器可以根据自己的策略进行更改;如果值为0,将使用默认延迟。

  15.int DB _ ENV-set _ shm _ key(DB _ ENV * dbenv,long shm _ key);

  为在VxWorks中创建的BDB环境的共享内存区域或支持X/Open-style共享内存接口的系统内存指定一个基本段ID。提示:你在自己系统的外壳下输入man 2 shmget,看看是否支持。

  这个基本段ID将在第一次创建BDB共享内存区域时使用。当创建一个新的共享内存区域时,新的ID号将比这个ID稍大。例如,如果基本ID是35,则第一个创建的共享内存区域的ID号是35,下一个将是36和40之间的数字。BDB环境只创建一个主共享内存区,环境支持的每个子系统都会有自己的额外共享内存区(比如锁、日志、内存池和事件),每个额外的内存池缓存也会得到额外的共享内存区。如果相同的段ID号已经存在,它将被移出现有区域。

  使用这种方法有两个好处:首先,如果没有这种机制,就不可能知道应用程序是否使用相同的段ID号来创建不同的BDB环境。其次,即使每次都用同一个段ID号来创建环境,之前创建的段也会被移出,这些系统中的段不会无限增长。

  类似地,您也可以用DB_CONFIG配置这个基本段ID,格式如下:

  Set_shm_key标识号

  它只在指定的环境句柄上工作,但不包括库环境上的相关操作。环境打开后,不能调用该函数。如果在环境打开后调用这个函数,现有环境的数据可能会因为不同步而腐烂。

  16.int DB _ ENV-get _ shm _ key(DB _ ENV * dbenv,long * shm _ keyp);

  返回基本段ID。这个函数可以在程序运行的任何时候被调用。

  17.int DB _ ENV-set _ thread _ id(DB _ ENV * dbenv,int (*thread_id)(DB_ENV *dbenv,pid_t *pid,DB _ threadid _ t * tid));

  声明一个返回由当前线程管理的特定pid/tid对的函数。它只在指定的环境句柄上工作,但不包含库环境上的相关操作。这个函数可以在程序运行的任何时候被调用。

  回调函数参数:

  Pid指向pid_t结构的一个内存地址,用于返回当前控制线程的进程id。

  Tid指向当前控制线程的进程id返回的db_threadid_t结构的内存地址。

  标准系统库中有很多调用返回进程的线程ID。但是如果BDB程序动态地创建进程和线程,你必须小心分配特定的ID。在大多数线程系统中,process \ thread ID可以在process \ thread退出后立即重用。有这样一种情况:如果process \ thread已经退出,但是DB_ENV- failchk没有被调用,那么会创建一个新的process \ thread ID,而这个ID正好重用了之前退出的thread \ process,这可能会导致后面调用的DB_ENV- failchk在判断正确之前就退出了。解决这个问题的方法有两个:一是在调用DB_ENV- failchk之前禁止创建新的进程\线程;其次,新创建的process \ thread不会重用以前使用的pid/tid对。注意:为DB_ENV- set_isalive指定的is_alive函数必须与为此函数指定的thread_id函数兼容。有些系统可能无法识别db_threadid_t结构。请联系客服解决此问题。

  如果没有为程序指定thread_id函数,POSIX线程会调用getpid()或pthread_self,UI线程会调用getpid()和thr_self()函数。

  18.int DB _ ENV-set _ thread _ id _ string(DB _ ENV * dbenv,char *(* thread _ id _ string)(DB _ ENV * dbenv,

  pid_t pid,db_threadid_t tid,char * buf));

  声明一个函数,将pid/tid对格式化到调用者提供的缓冲区中。它只在指定的环境句柄上工作,但不包括库环境上的相关操作。这个函数可以在程序运行的任何时候被调用。回调函数参数:

  PID进程ID号。

  螺纹的TID id号。

  Buf就是上面说的缓冲区,大小至少是DB_THREADID_STRLEN。

  如果没有指定thread_id_string函数,默认情况下会这样显示:‘PID/tid’。

  19.int DB _ ENV-get _ time out(DB _ ENV * dbenv,db_timeout_t *timeoutp,u _ int 32 _ t flag);

  为数据库环境中的锁/事件指定延迟。延迟计数仅在锁定线程控制块或死锁检测启用时发生,因此延迟的正确设置取决于死锁检测是否启用。这个延迟值在基于每锁/每事务的环境中可能无效。

  这个函数配置整个数据库环境,而不仅仅是环境句柄。这个函数可以在程序运行的任何时候被调用。

  20.int DB _ ENV-set _ tmp _ dir(DB _ ENV * dbenv,const char * dir);

  指定本地临时文件的路径。临时文件的创建将基于此路径。临时文件可能很大,这取决于数据库的大小。

  如果没有指定临时文件路径,将依次检测以下路径,第一个检测到的路径将用作默认的临时文件路径。

  环境变量TMPDIR,TEMP,TMP,TempFolder;GetTempPath接口函数返回的路径(Windows);/var/tmp,/usr/tmp,/temp,/tmp .只有在打开环境时指定了DB_USE_ENVIRON和DB_USE_ENVIRON_ROOT标志,才能使用此函数。

  类似地,临时文件的路径也可以在DB_CONFIG文件中按以下格式指定:

  set_tmp_dir /tmppath

  这个函数只配置环境句柄,而不是整个数据库环境。这个函数只能在环境打开之前调用。如果在环境之后调用它,可能会由于不一致而导致数据损坏。

  21.int DB _ ENV-set _ verbose(DB _ ENV * dbenv,u_int32_t which,int onoff);

  该功能可以打开/关闭BDB指定的附加信息或调试信息。要获得附加信息,需要为程序配置详细信息。详情请参考DB- set_errfile(未翻译)。当onoff为0时,不输出附加信息;当它不为0时,输出附加信息。

  也可以使用DB_CONFIG文件配置数据库环境信息,格式如下:

  set_verbose数据库动词恢复

  这个函数只配置环境句柄,而不是整个数据库环境。这个函数可以在程序运行的任何时候被调用。以下参数之一:

  启用死锁检测时,DB_VERB_DEADLOCK显示附加信息。

  DB_VERB_RECOVERY在恢复时显示附加信息。

  DB_VERB_REGISTER显示关于DB_ENV- open和DB_REGISTER标志的附加信息。

  DB_VERB_REPLICATION显示复制消息的附加信息。如果你需要得到调试拷贝程序的完整日志。在编译BDB时需要启用- enable-diagnostic并调用DB_ENV- set_verbose。

  启用死锁检测时,DB_VERB_WAITSFOR显示等待表。

  22.int DB _ ENV-get _ verbose(DB _ ENV * dbenv,u_int32_t which,int * on offp);

  它获取哪个标志被置位或取消置位。在程序运行的任何时候都可以调用这个函数。

  其他六个信息函数尚未翻译,详情请参考文档。

  真的杀人了,BerkeleyDB,混蛋~

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 关系型数据库与非关系型数据库简介一样吗,关系型数据库非关系型数据库有哪些
  • 关系型数据库与非关系型数据库简介一样吗,关系型数据库非关系型数据库有哪些,关系型数据库与非关系型数据库简介
  • 关于redis数据库入门详细介绍图片,redis数据库的使用,关于Redis数据库入门详细介绍
  • 使用php连接mysql数据库,php连接数据库的方法
  • 使用php连接mysql数据库,php连接数据库的方法,一文详解PHP连接MySQL数据库的三种方式
  • 什么是分库分表,为什么要进行分库分表-,分库分表的区别,数据库分库分表是什么,什么情况下需要用分库分表
  • vb中adodb连接数据库,
  • treeview控件绑定数据,wpf treeview数据绑定,详解TreeView绑定数据库
  • sql的多表查询,数据库如何实现多表查询
  • SQL数据库的图形管理界面工具是,sql图形界面创建数据库
  • SQL数据库的图形管理界面工具是,sql图形界面创建数据库,SQLServer2019 数据库的基本使用之图形化界面操作的实现
  • sql数据库定时备份怎么弄,mysql 定期备份
  • sql数据库定时备份怎么弄,mysql 定期备份,MySQL 数据库定时备份的几种方式(全面)
  • sqlserver的nvarchar和varchar,数据库varchar和nvarchar
  • sqlserver的nvarchar和varchar,数据库varchar和nvarchar,SQL中varchar和nvarchar的基本介绍及其区别
  • 留言与评论(共有 条评论)
       
    验证码: