int
mysql_library_init(int argc,
char **argv,
char **groups)
在调用任何其他 MySQL 函数之前调用此函数来初始化 MySQL 客户端库,无论您的应用程序是常规客户端程序还是使用嵌入式服务器。如果应用程序使用嵌入式服务器,此调用将启动服务器并初始化服务器使用的所有子系统(mysys
、InnoDB
等)。
为避免应用程序使用完库后发生内存泄漏(例如,关闭与服务器的连接后),请务必
mysql_library_end()
显式调用。这使得能够执行内存管理以清理和释放库使用的资源。参见
第 5.4.40 节,“mysql_library_end()”。
应用程序是作为常规客户端运行还是使用嵌入式服务器的选择取决于您是否在链接时使用libmysqlclient
或
libmysqld
库来生成最终的可执行文件。有关其他信息,请参阅
第 4 章,C API 函数参考。
在非多线程环境中,
mysql_library_init()
可以省略对 的调用,因为mysql_init()
会在必要时自动调用它。但是,
mysql_library_init()
在多线程环境中不是线程安全的,因此mysql_init()
调用
mysql_library_init()
. 您必须
mysql_library_init()
在生成任何线程之前调用,或者使用互斥锁来保护调用,无论您是调用
mysql_library_init()
还是间接通过
mysql_init()
. 在任何其他客户端库调用之前执行此操作。
argc
和argv
参数类似于 的参数
,main()
并允许将选项传递给嵌入式服务器。为方便起见,如果服务器没有命令行参数,则argc
可能为(零)。0
这是仅用作常规(非嵌入式)客户端的应用程序的常见情况,调用通常写为
mysql_library_init(0, NULL,
NULL)
.
#include <mysql.h>
#include <stdlib.h>
int main(void) {
if (mysql_library_init(0, NULL, NULL)) {
fprintf(stderr, "could not initialize MySQL client library\n");
exit(1);
}
/* Use any MySQL API functions here */
mysql_library_end();
return EXIT_SUCCESS;
}
当要传递参数(argc
大于0
)时,忽略第一个元素
argv
(它通常包含程序名称)。
mysql_library_init()
制作参数的副本,以便销毁
argv
或groups
在调用后安全。
对于嵌入式应用程序,如果要在不启动嵌入式服务器的情况下连接到外部服务器,则必须为 指定一个负值argc
。
该groups
参数是一个字符串数组,指示从中读取选项的选项文件中的组。请参阅使用选项文件。在 array 中创建最后一个条目NULL
。为方便起见,如果groups
参数本身是
NULL
,则默认使用
[server]
和
组。[embedded]
#include <mysql.h>
#include <stdlib.h>
static char *server_args[] = {
"this_program", /* this string is not used */
"--datadir=.",
"--key_buffer_size=32M"
};
static char *server_groups[] = {
"embedded",
"server",
"this_program_SERVER",
(char *)NULL
};
int main(void) {
if (mysql_library_init(sizeof(server_args) / sizeof(char *),
server_args, server_groups)) {
fprintf(stderr, "could not initialize MySQL client library\n");
exit(1);
}
/* Use any MySQL API functions here */
mysql_library_end();
return EXIT_SUCCESS;
}