mco_trans_set_cleanup_period
此函数控制 MVCC 事务管理器移除未使用版本的频率。
通过将 cleanup_period
设置为零,可以禁用每个连接的清理操作。这对于创建许多短写事务和长只读事务的应用程序来说非常重要。仅在只读事务中进行清理是有意义的(因为读写事务无论如何都无法清理任何内容 - 它们必须等待可能很长的只读事务提交)。需要强调的是,如果不移除未使用的版本,大量重复索引可能会导致性能下降。
当任务与数据库断开连接,或者如果 per_connection_cleanup
被设置为 MCO_NO
时,由连接创建的任何未使用的剩余版本都会被放入一个“公共池”(所有连接共用),由所有连接进行处理。因此,如果任务 A 通常不触及表 T,它仍可能导致 T 的某个版本从索引中移除,因此在访问索引时需要对运行时应用锁。我们建议实现一个使用全局池的任务(连接),并且是最后一个与数据库断开连接的。默认设置是使用全局池。对于从不同任务(连接)访问不同表(类)且不会产生任何锁定冲突的应用程序来说,使用本地(每个连接)池是有意义的。
int mco_trans_set_cleanup_period(
/*IN*/ mco_db_h db,
/*IN*/ int cleanup_period,
/*IN*/ mco_bool per_connection_cleanup
);
参数
db
mco_db_h
由 mco_db_connect()
建立的数据库句柄。
cleanup_period
int
在移除未使用的版本之前要处理的提交次数。
per_connection_cleanup
bool
MCO_YES
或 MCO_NO
。
返回
int
cleanup_period
的上一个值。
示例
/* 应用程序代码片段 */
const char * dbname = "SimpleDb";
int main(int argc, char* argv[])
{
mco_db_h db;
MCO_RET rc;
mco_device_t dev;
mco_db_params_t db_params;
mco_trans_h t;
int period = 1000;
...
rc = mco_db_open_dev( dbname, simple_get_dictionary(), &dev, 1, &db_params );
if ( MCO_S_OK != rc )
{
rc = mco_db_connect( dbname, &db );
...
period = mco_trans_set_cleanup_period( db, period, MCO_NO );
printf("\nThe previous Cleanup Period was %d.", period );
}
...
}
文件
头文件:
mco.h
源文件:
mursiw.c
库:
libmcotexcl.a
头文件:
mco.h
源文件:
mursiw.c
库:
libmcotmursiw.a
头文件:
mco.h
源文件:
mvcc.c
库:
libmcotmvcc.a