最近刚刚需要同时用到
mysql和多线程,网上mysql和多线程的教程很多,但是能同时使用的资料没找到,不过通过网上的这些的资料,写了个demo来理解和理顺自己这几天的学习,分享一下。
Mysql_Base.h
01
#include
02
#include
03
04
#include
05
#include
06
#include
07
#include
08
#include
13
#define NUM_THREADS 5
14
15
typedef
struct
parameters_1{
16
char
order[
60
];
17
char
T_name[
20
];
18
int
id;
19
} para_1;
20
21
typedef
struct
parameters_2{
22
char
order[
60
];
23
//char dbname[20];
24
int
id;
25
} para_2;
26
class
MYSQL_BASE
27
{
28
private
:
29
static
int
p_thread;
30
static
MYSQL mysql[
5
];
31
static
MYSQL_RES *res;
//查询结果集,结构类型
32
//static MYSQL_FIELD *fd; //包含字段信息的结构
33
static
MYSQL_ROW row;
//存放一行查询结果的字符串数组
34
static
char
sqlbuf[
60
];
//存放Mysql指令的字符串
35
static
char
usename[NUM_THREADS][
20
];
36
static
char
password[NUM_THREADS][
20
];
37
static
HANDLE _Thread[
5
];
38
static
CRITICAL_SECTION g_cs;
//临界区
39
//static HANDLE Mutex;
40
41
42
static
para_1 f_para;
43
static
para_2 s_para;
44
45
public
:
46
MYSQL_BASE();
47
~MYSQL_BASE();
48
49
public
:
50
void
Mysql_Start(
char
mysqlname[
20
],
char
mypwd[
20
],
char
order[
60
],
char
daname[
20
]);
51
52
private
:
53
static
DWORD WINAPI Database_Order(
void
*para);
//(char dbname[20],void *id);
54
static
DWORD WINAPI Table_Order(
void
*para);
//(char dbname[20],char order[60],void *id);
55
static
void
ShowResult(MYSQL sql);
56
57
};
02
03
04
05
06
07
08
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Mysql_Base.cpp
001
#include "Mysql_Base.h"
002
#include
003
using
namespace
std
;
004
005
//静态变量的初始化
006
MYSQL
MYSQL_BASE
::
mysql
[
NUM_THREADS
];
007
MYSQL_RES
*
MYSQL_BASE
::
res
;
008
MYSQL_ROW
MYSQL_BASE
::
row
;
009
char
MYSQL_BASE
::
usename
[
NUM_THREADS
][
20
];
010
char
MYSQL_BASE
::
password
[
NUM_THREADS
][
20
];
011
int
MYSQL_BASE
::
p_thread
=
0
;
012
HANDLE
MYSQL_BASE
::
_Thread
[
5
];
013
CRITICAL_SECTION
MYSQL_BASE
::
g_cs
;
014
015
para_1
MYSQL_BASE
::
f_para
;
016
para_2
MYSQL_BASE
::
s_para
;
017
//HANDLE MYSQL_BASE::Mutex;
018
019
//FILE *stream;
020
021
MYSQL_BASE
::
MYSQL_BASE
()
022
{
023
InitializeCriticalSectio n
(
&
g_cs
);
024
//res = new MYSQL_RES;
025
}
026
MYSQL_BASE
::~
MYSQL_BASE
()
027
{
028
//mysql_close(&mysql);
029
}
030
031
void
MYSQL_BASE
::
Mysql_Start
(
char
mysqlname
[
20
],
char
mypwd
[
20
],
char
order
[
60
],
char
Tname
[
20
])
032
{
033
034
mysql_init
(
&
mysql
[
p_thread
]);
035
//Mutex = CreateMutex(NULL,FALSE,NULL);
036
037
//para_2 s_para;
038
for
(;
p_thread
<</span> NUM_THREADS;)
039 {
041 strcpy(usename[p_thread],mysqlname);
042 strcpy(password[p_thread],mypwd);
043
044 strcpy(s_para.order,order);
045 strcpy(f_para.order,order);
046 s_para.id = p_thread;
047 f_para.id = p_thread;
048 strcpy(f_para.T_name,Tname);
049
050 if (((memcmp(order,"create d",8))==NULL)||((memcmp(order,"show d",6))==NULL)||((memcmp(order,"drop d",6))==NULL))//对数据库的操作
051 {
052 _Thread[p_thread] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MYSQL_BASE::Database_Order,&s_para,0,NULL);
053 }
054 if ((memcmp(order,"create t",8)==NULL)||(memcmp(order,"show t",6)==NULL)||(memcmp(order,"insert",6)==NULL)
055 ||(memcmp(order,"update",6)==NULL)||(memcmp(order,"delete",6)==NULL)||(memcmp(order,"select",6)==NULL)
056 ||(memcmp(order,"drop t",6)==NULL))//对表的操作
057 {
058 _Thread[p_thread] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MYSQL_BASE::Table_Order,&f_para,0,NULL);
059 }
060 //sleep(2);
061 //CloseHandle(_Thread[p_thread]);
062 //p_thread++;
063 return;
064 //ResumeThread(Thread_1);
065
066 }
067 }
068
069 DWORD WINAPI MYSQL_BASE::Database_Order(void *para)
070 {
071 //DWORD dw = WaitForSingleObject(_Thread[p_thread],INFINITE);
072 //printf("%d\n",dw == WAIT_OBJECT_0);
073 EnterCriticalSection(&g_cs);
074 para_2 *c_para = (para_2*)para;
075 //sprintf(sqlbuf,CREATE_QUERY,dbname);
076 if (mysql_real_connect(&mysql[c_para->id], "localhost", usename[c_para->id],
077 password[c_para->id],NULL, 0, NULL, 0) == NULL) {
078 printf("Error %u: %s\n", mysql_errno(&mysql[c_para->id]), mysql_error(&mysql[c_para->id]));
079 exit(1);
080 }
081 if (!strncmp(c_para->order,"create d",8))
082 {
083 if (mysql_query(&mysql[c_para->id], c_para->order))
084 {
085 printf("Error %u: %s\n", mysql_errno(&mysql[c_para->id]), mysql_error(&mysql[c_para->id]));
086 exit(1);
087 }
088 else
089 {
090 printf("Create a database successfully!\n");
091 mysql_query(&mysql[c_para->id], "show databases;");
092 ShowResult(mysql[c_para->id]);
093 }
094 }
095 if (!strncmp(c_para->order,"drop d",6))
096 {
097 if (mysql_query(&mysql[c_para->id], c_para->order))
098 {
099 printf("Error %u: %s\n", mysql_errno(&mysql[c_para->id]), mysql_error(&mysql[c_para->id]));
100 exit(1);
101 }
102 else
103 {
104 printf("delete a database successfully!\n");
105 mysql_query(&mysql[c_para->id], "show databases;");
106 res = mysql_store_result(&mysql[c_para->id]);
107 int num_fields = mysql_num_fields(res);
108 while ((row = mysql_fetch_row(res)))
109 {
110 for(int i = 0; i <</span> num_fields; i++)
111 {
112 printf("%s ", row[i] ? row[i] : "NULL");
113 }
114 printf("\n");
115 }
116 mysql_free_result(res);
117 }
118 }
119 if (!strncmp(c_para->order,"show d",6))
120 {
121 if (mysql_query(&mysql[c_para->id], c_para->order))
122 {
123 printf("Error %u: %s\n", mysql_errno(&mysql[c_para->id]), mysql_error(&mysql[c_para->id]));
124 exit(1);
125 }
126 ShowResult(mysql[c_para->id]);
127
128 }
129
130 //mysql_close(&mysql);
131 LeaveCriticalSection(&g_cs);
132 CloseHandle(_Thread[c_para->id]);
133 p_thread++;
134 //ReleaseMutex(_Thread[p_thread]);
135 return p_thread;
136
137 //return 1;
138 }
139
140 DWORD WINAPI MYSQL_BASE::Table_Order(void *para)
141 {
142 //WaitForSingleObject(Mutex,INFINITE);
143 EnterCriticalSection(&g_cs);
144 para_1 *m_para = (para_1*)para;
145 //printf("%d,%s\n",m_para->id,m_para->order);
146 if (mysql_real_connect(&mysql[m_para->id], "localhost", usename[m_para->id],
147 password[m_para->id],m_para->T_name, 0, NULL, 0) == NULL) {
148 printf("Error %u: %s\n", mysql_errno(&mysql[m_para->id]), mysql_error(&mysql[m_para->id]));
149 exit(1);
150 }
151
152 if (mysql_query(&mysql[m_para->id], m_para->order)) {
153 printf("Error %u: %s\n", mysql_errno(&mysql[m_para->id]), mysql_error(&mysql[m_para->id]));
154 exit(1);
155 }
156 if ((strncmp(m_para->order,"select",6))==NULL||(strncmp(m_para->order,"show",4))==NULL)
157 {
158 ShowResult(mysql[m_para->id]);
159 }
160 if ((strncmp(m_para->order,"create t",8))==NULL)
161 {
162 printf("Create a database successfully!\n");
163 mysql_query(&mysql[m_para->id], "show tables;");
164 ShowResult(mysql[m_para->id]);
165 }
166 if ((strncmp(m_para->order,"drop t",6))==NULL)
167 {
168 printf("delete a database successfully!\n");
169 mysql_query(&mysql[m_para->id], "show tables;");
170 ShowResult(mysql[m_para->id]);
171 }
172 if ((strncmp(m_para->order,"insert",6))==NULL)
173 {
174 printf("insert a data successfully!\n");
175 //char in_order[60];
176 //sprintf(in_order,"select * from s%",m_para->T_name);
177 //mysql_query(&mysql[m_para->id], in_order);
178 //ShowResult(mysql[m_para->id]);//表格插入操作之后的可视化工作不好做
179 }
180 //mysql_close(&mysql);
181 //ReleaseMutex(Mutex);
182 LeaveCriticalSection(&g_cs);
183 p_thread++;
184 return p_thread;
185 }
186
187 void MYSQL_BASE::ShowResult(MYSQL sql)
188 {
189 res = mysql_store_result(&sql);
190 int num_fields = mysql_num_fields(res);
191 while ((row = mysql_fetch_row(res)))
192 {
193 for(int i = 0; i <</span> num_fields; i++)
194 {
195 printf("%s ", row[i] ? row[i] : "NULL");
196 }
197 printf("\n");
198 }
199 mysql_free_result(res);
201 }
204 int main()
205 {
206 //pthread_t tids[NUM_THREADS];
207 MYSQL_BASE *mysql_base = new MYSQL_BASE;
208 char dbname[20],passwd[20],order[60],dataname[20];
209
210 printf("Please provide a screen name and password:\n");
211 strcpy(dbname,"root");
212 strcpy(passwd,"2175");
213 //gets(dbname);
214 //gets(passwd);
215 printf("Please enter a MYSQL order and mysql name when needed:\n");
216 while(1)
217 {
218 gets(order);
219 gets(dataname);
220 //strcpy(order,"show databases;");
221 //strcpy(dataname,"");
222 mysql_base->Mysql_Start(dbname,passwd,order,dataname);
223 //sleep(2);
224 }
227 return 0;
228 }
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
201
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
227
228
数据库的某些操作的可视化没有做好,比如说insert。关于多线程的保护开始选择了互斥量,但是后来还是换成了更容易理解的临界区,静态变量一定要初始化,这里放在了.cpp文件的开头,其实数据库的很多操作都是互通的,所以不用每个操作都写成函数,所以我分成了两类,一类是对数据库的操作,一类是对数据库中表的操作,主要是因为链接函数的参数问题,也对mysql理解不够,相信绝对是用一个函数来代替的,分类也显得很代码很笨重。下面是运行后的截图(我把用户名和密码写死了):