linux下多线程连接mysql(C语言)
代码使用了pthread库,在Ubuntu环境下使用gcc编译并运行成功。
增加的编译选项 -lpthread -Llibmysqlclient_r.so
后者是mysql 的线程安全链接库。
原有代码嵌入在一个应用程序中,这里只给出数据库访问部分。
关键是每个线程维护一个单独的MYSQL结构,并初始化线程专用数据,由于mysql_real_connect会自动调用mysql_thread_init(),函数里面不再重复调用。
int main()
{
mysql_library_init(0,NULL,NULL);
pthread_t producer;
pthread_t consumer_1;
pthread_t consumer_2;
//produce_fun不涉及数据库链接,不贴出来
pthread_create(&producer,NULL,produce_fun,NULL);
pthread_create(&consumer_1,NULL,consume_fun,NULL);
pthread_create(&consumer_2,NULL,consume_fun,NULL);
//下面的三句非常重要,main线程等待其他三个线程的结束,避免main线程执行到mysql_library_end时退出,而
//其他三个线程仍然在运行并报错的情形
pthread_join(producer,NULL);
pthread_join(consumer_1,NULL);
pthread_join(consumer_2,NULL);
mysql_library_end();
return 0;
}
void addRecord_d(MYSQL *ptr_db,const char *t_name,int item){
char query_buffer[100];
sprintf(query_buffer,"insert into %s values(0,%d)",t_name,item);
int ret=mysql_query(ptr_db,query_buffer);
if(ret){
fprintf(stderr,"%s%s\n","cannot add record to ",t_name);
return;
}
unsigned long long update_id=mysql_insert_id(ptr_db);
printf("add record (%llu,%d) ok.",update_id,item);
}
void * consume_fun(void *arg){
MYSQL db;
MYSQL *ptr_db=mysql_init(&db);
mysql_real_connect();
//蓝色部分可以改为其他任何带操作数据库语句的代码
//procedure
while(1){
printf("consumer...");
int item=consume(&p);
addRecord_d(ptr_db,"test",item);
}
mysql_thread_end();
pthread_exit(NULL);
}
//MYSQL_RES保存查询结构
MYSQL_RES* result_ = NULL;
int error_code = 0;
char error_info[1024] = '\0';
//对mysql数据库进行查询操作:
char query_sql[1024] = "select * from db_name.table_name";
if(result_ != NULL)
{
}
if(link_ == NULL)
{
}
//执行sql查询
if(mysql_query(link_,query_sql) != 0)
{
}
else
{
}
//查询成功,保存查询结果
result_ = mysql_store_result(link_);
if(result_ == NULL)
{
}
//获取查询结果的行数(记录数)
return mysql_num_rows(result_);
//获取查询结果的字段数
return mysql_num_fields(result_);
//获取查询结果的各个字段的字段名称
MYSQL_FIELD
unsing int
unsigned int
num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields;i++)
{
}
//获取查询出来的结果,即遍历查询到的每一行记录
MYSQL_ROW
unsigned
unsigned
num_fields
while((row = mysql_fetch_row(result_)))
{
}
if(result_ != NULL)
{
}
if(link_ != NULL)
{
}
使用mysql C语言API编写程序—建立mysql数据库链接(超时设定,建立链接)
//MYSQL句柄
MYSQL* link_ = NULL;
//对mysql操作进行必要的初始化
if(link_
{
}
link_
//设置超时时间(链接超时时间,查询超时时间,写数据库超时时间)
int
if(link_ != NULL)
{
}
//真正建立mysql链接
char
char
char
unsigned short host_port = 3306;
int
char
if(!mysql_real_connect(link_,host_name,user_name,user_password,NULL,host_port,NULL,0))
{
}
else
{
}
mysql—开发C,C++程序,避免连接超时、读数据库超时、写数据库超时,系统再也不怕被MySQL服务器挂死
避免连接超时:
int g_iTimeOut = 5;
mysql_options(&mysql_, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&g_iTimeOut);
避免读超时:
mysql_options(&mysql_, MYSQL_OPT_READ_TIMEOUT, (const char *)&g_iTimeOut);
避免写超时:
Mysql乱码—字段编码(filed)、表编码(table)、数据库编码(db)、数据库服务器(dbserver)编码
Mysql数据库 2010-11-28 11:09:43 阅读38 评论0
Mysql数据库的编码分为四级:
数据库编码选择的一般准则:
创建数据库并指定编码:
方法1、
方法2、
创建表并指定编码:
方法1、
方法2、
指定字段的编码:
方法:
create
(
);
MySQL++ 一个成熟的C++封装
http://tangentsoft.net/mysql++/
http://tangentsoft.net/mysql++/doc/pdf/userman.pdf
一些用例:
1. 使用方便
2. 方便的数据访问
3. sql模板
4. 与stl的融合