当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-05-02 15:44:00  来源:本站整理

利用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吧.

  以上是“利用C衔接Mysql[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用C衔接Mysql
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .