利用C衔接Mysql[MySQL防范]
本文“利用C衔接Mysql[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
1、高性能数据库的挑选
---- 在数据库的利用开辟中,常常会碰到性能和代价的之间冲突.以作者在开辟股市行
情查询和交易系统中碰到的问题为例,要在及时记录1000多只股票每分钟更新一次的行
情数据的同时,呼应大量并发用户的数据查询恳求.考虑到性价比和易保护性,系统又
要求在基于PC服务器,Windows NT平台的软硬件环境下实现.开始,我们采取了MS SQL
Server 6.5 作为数据库系统,用Visual C++ 6.0开辟了拜候数据库的前端,利用ODBC
数据接口,在举行了大量的数据库配置和程序优化后,发现仍不能满意性能要求.后采
用sql server的DB-Library接口,绕过了ODBC注释层,可以每秒更新行情数据30次,同
时支持20-30个左右的并发用户举行行情查询,基本满意要求(单台PC服务器,单PII3
50 CPU,内存128M,SCSI硬盘).有没有大概进一步提高系统的性能和负载本领呢?经
过解析,数据库服务器是系统的瓶颈.当然,可以采取Unix服务器+大型数据库的系统
平台,但其开辟、运行、保护的费用比微机+Windows NT平台的费用超过数倍.我们在
别的一些系统的开辟中,也常常碰到这样的冲突.如安在微机平台上成立大容量、高效
率、易保护、高性价比的数据库系统呢?
---- 观察国内基于微机平台的数据库利用系统,典型的如网易的分布式邮件系统,采取
了FreeBSD+MySQL的平台,其容量、负载本领和呼应速度都很优异.作者查阅了MySQL的
相关文档,发现MySQL是GNU软件(即OpenSource安闲软件)中非常优异的数据库系统,
它完好符合SQL92 (Entry level)和 ODBC( level 0-2)标准,在符合POSIX标准的操
作系统上实现了非常高效的关系型数据库管理系统.按照MySQL供应的文档,它的数据操
作可谓全部数据库中最高效的,Benchmark以下表:
Reading 2000000 rows by index
Database Seconds
mysql 367
mysql_odbc 464
DB2_odbc 1206
informix_odbc 121126
ms-sql_odbc 1634
Oracle_odbc 20800
solid_odbc 877
sybase_odbc 17614
Inserting (350768) rows
Database Seconds
mysql 381
mysql_odbc 619
db2_odbc 3460
informix_odbc 2692
ms-sql_odbc 4012
oracle_odbc 11291
solid_odbc 1801
sybase_odbc 4802
(run on the same NT 4.0 Machine)
---- 从MySQL的Benchmark中可以看到,MySQL的性能非常出众(当然,测试的MySQL系统
大概作了优化,被测数据大概是针对MySQL挑选的),并且MySQL供应了对Windows NT的
支持.Windows NT+MySQL可否成为构建高性能数据库利用的抱负挑选呢?作者用MySQL
的数据接口改写了程序,经过一段时间的运行,证明MySQL确切是高效而安定的数据库,
非常合适构建大容量、高效率、易保护、高性价比的数据库利用系统.现将MySQL的安装
、运行、开辟的心得与大家同享.
2、MySQL的安装和运行
---- 首先从http://www.mysql.com/(国内用户可以从http://www.freecode.com.cn/m
irror/mysql/)下载MySQL的履行代码及源代码.注意,Windows NT用户要挑选NT下的执
行代码,我下载的是mysql-shareware-3.22.32-win.zip.解包后履行Setup,按屏幕提
示便可完成安装.
---- 拷贝MySQL根目录(c:\mysql)下的my-example.cnf到c:\my.cnf,按文件中的提醒
编辑my.cnf(假如MySQL的根目录是c:\mysql,可暂不窜改my.cnf).在NT的掌握台窗口
中,进入MySQL的履行目录(c:\mysql\bin),履行
---- C:\mysql\bin\mysqld-shareware --standalone
---- 则MySQL的数据库引擎启动.翻开另一NT掌握台窗口,履行
---- C:\mysql\bin\mysql mysql
---- 成立数据库衔接,呈现"mysql>"提醒符后,履行
---- mysql > DELETE FROM user WHERE Host='localhost' AND User='';
---- mysql > QUIT
---- 删除全部的非受权用户.
---- 然后履行
---- C:\mysql\bin\mysqladmin reload
---- C:\mysql\bin\mysqladmin -u root password your_password
---- 此中,your_password是你挑选的数据库管理员的口令,必须妥善保管.
---- 假如要每次都以管理员身份衔接数据库,则编辑c:\my.cnf,在[client]段中加入
:
user=root
password= your_password
假如要终止MySQL的数据库引擎,可以履行
C:\mysql\bin\mysqladmin -u=root -p shutdown
按提醒输入管理员口令后,MySQL的数据库引擎终止.
3、MySQL客户端利用的开辟
---- MySQL供应了丰富的数据接口API,包含C、C++、Perl、PHP、Python、TCL等API和
JDBC,ODBC接口.出于性能考虑,我们采取了MySQL的C API举行开辟.现以Visual C++
环境为例,作一简单介绍.
---- 新建一Win32 Console Application的Project,把"c:\mysql\include"增添到编
译选项的包含途径中(在Project Options中加入 /I "d:\mysql\include&quounter.cgol.net 魈迦缦拢?
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <mysql.h>
int main( int argc, char * argv[] )
{
char szTargetDSN[] = "test";
char szSqlText[500]="";
char aszFlds[ 25 ][ 25 ];
MYSQL * myData ;
MYSQL_RES * res ;
MYSQL_FIELD * fd ;
MYSQL_ROW row ;
int i,j,k;
BOOL bCreate = TRUE;
if ( (myData = mysql_init((MYSQL*) 0))
//初始化数据构造
&& mysql_real_connect( myData, NULL,
//衔接数据库
"root", " your_password ", szTargetDSN,
MYSQL_PORT, NULL, 0 ) )
{
if(bCreate)
{
sprintf(szSqlText, //构造SQL语句
"create table mytable "
//新建一张表
"(time datetime, s1 char(6), "
"s2 char(11), s3 int, s4 int)");
if (mysql_query( myData, szSqlText))
//履行SQL语句
{//履行SQL语句出错
ErrLog( "Can't create table") ;
mysql_close( myData ) ;
return FALSE ;
}
}
sprintf(szSqlText,
"insert into mytable "
//向表中插入数据
"values('2000-3-10 21:01:30',"
//注意时间的格局
"'Test','MySQLTest',2000,3)");
if (mysql_query( myData, szSqlText))
{//履行SQL语句出错
ErrLog( "Can't insert data to table") ;
mysql_close( myData ) ;
return FALSE ;
}
sprintf(szSqlText, "select * from mytable ");
if (mysql_query( myData, szSqlText))
//举行数据检索
{
//履行SQL语句出错
mysql_close( myData ) ;
return FALSE ;
}
else
{
res = mysql_store_result( myData ) ;
//获得查询后果
i = (int) mysql_num_rows( res ) ;
//获得有效记录数
printf( "Query: %s\n%ld records found:
\n", szSqlText, i ) ;
for ( i = 0 ; fd = mysql_fetch_field( res ) ;
i++ )
strcpy( aszFlds[ i ], fd->name ) ;
//获得各字段名
for (i=1; row = mysql_fetch_row( res ); )
//顺次读取各条记录
{j = mysql_num_fields( res ) ;
//获得记录中的字段数
printf( "Record #%ld:-\n", i++ ) ;
for ( k = 0 ; k < j ; k++ )
//输出各字段的值
printf( " Fld #%d (%s): %s\n", k + 1, aszFlds[ k ],
(((row[k]==NULL)||
(!strlen(row[k])))?"NULL":row[k])) ;
puts( "==============================\n" ) ;
}
mysql_free_result( res ) ;
}
}
else
{//衔接数据库出错
ErrLog( "Can't connect to the mysql server ") ;
mysql_close( myData ) ;
return FALSE ;
}
mysql_close( myData ) ;
return TRUE ;
}
---- 对此中几个函数作简单阐明,具体阐明,可参考MySQL文档:
---- 1. MYSQL *mysql_init(MYSQL *mysql)
---- 初始化一个范例为MYSQL的数据构造,为履行mysql_real_connect()做预备.参数
mysql为指向该构造的指针,假如mysql为NULL,则新建并初始化一个MYSQL的数据构造.
新建的构造将在mysql_close()中释放.
---- 若成功,返回初始化的MYSQL数据构造的指针,不然返回NULL.
---- 2. MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
---- const char *user, const char *passwd, const char *db,
---- unsigned int port, const char *unix_socket, unsigned int client_flag)
---- 与MySQL数据库引擎成立衔接.在履行进一步的数据操作之前,必须保证mysql_re
al_connect()成功返回.
---- 参数mysql是mysql_init()的返回值;
---- 参数host是运行MySQL数据库引擎的机械的TCP/IP主机名,如为NULL则默许为"lo
calhost";
---- 参数user和passwd是MySQL数据库的合理用户和口令;
---- 参数db是衔接的数据库名;
---- 参数port,unix_socket和client_flag普通取默许值.
---- 3. int mysql_query(MYSQL *mysql, const char *query)
---- 履行query字符串中的SQL语句,query必须以0末尾.假如成功,返回0.
---- 4. MYSQL_RES *mysql_store_result(MYSQL *mysql)
---- 返回SELECT,SHOW,DESCRIBE, EXPLAIN等语句履行的后果.函数新建一个MYSQL_
RES的数据构造,把后果存储在该构造中.假如查询没有匹配的后果,则返回空数据集.
处理完后果集后,必须调用mysql_free_result().
---- 假如出错,返回NULL,不然返回MYSQL_RES构造的指针.
---- 5. MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
---- 取回后果集合的下一条记录,假如没有记录或出错,返回NULL.一条记录中的字段
数可以用mysql_num_fields(result)得到,各字段的值可以用row[0] 到 row[mysql_nu
m_fields(result)-1]的数组来拜候.
---- 在工程的链接选项中,加入c:\mysql\lib\libmysql.lib的接口库,把libmysql.d
ll复制到操作系统的system目录下(c:\winnt\system32),便可以编译运行了.
---- 到这里,一个简单的数据库利用就开辟完成了.当然,MySQL有一套功效丰富的AP
I,大家可以查看文档.别的,假如需求跨平台的移植性,可以考虑用MySQL的ODBC接口
.可以自己配置MySQL的ODBC衔接属性,也可以下载myodbc-2.50.29-nt.zip工具包来配
置.
4、总结
---- 作者用MySQL在Windows NT上构建了高性能、高安定性的数据库系统.这样,既可
以操纵Windows NT和Visual C++的友好界面,又可以得到MySQL的强盛功效.实践证明,
这种筹划本钱低(别忘了MySQL是免费的)、效率高、开辟周期短、运行安定(MySQL的
安定性在Yahoo、163、263等站点得到了极高的评价).
---- 目前,我的股市行情查询和交易系统已经得到了每秒钟记录70-100条股票行情数
据,同时呼应50个并发用户举行数据查询的性能,而系统的开辟、运行本钱却大幅降低
.假如您正为PC上的数据库效率哀愁,无妨也来试试MySQL吧.
本文地址: | 与您的QQ/BBS好友分享! |