c数据库连接超时
1、配置ODBC数据源。
2、使用sql函数进行连接。
对于1、配置数据源,配置完以后就可以编程操作数据库了。
对于2、使用SQL函数进行连接,参考代码如下:
#include
#include
#include
voidmain()
{
HENVhenv;//环境句柄
HDBChdbc;//数据源句柄
HSTMThstmt;//执行语句句柄
unsignedchardatasource[]="数据源名称";//即源中设置的源名称
unsignedcharuser[]="用户名";//数袭此据库的帐户拍野迅名
unsignedcharpwd[]="密码";//数据库的密码
unsignedcharsearch[]="selectxmfromstuwherexh=0";
SQLRETURNretcode;//记录各SQL函数的返回情况
//分配环境句柄
retcode=SQLAllocEnv(&henv);//等介于(SQL_HANDLE_ENV,SQL_NULL
,&henv);
//设置ODBC环境版本号为3.0
retcode=(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
//分配连接句柄
retcode=(henv,&hdbc);//等介于(SQL_HANDLE_DBC,henv,&hdbc);
//设置连接属性,登录超时为*rgbValue秒(可以没有)
//(hdbc,SQL_LOGIN_TIMEOUT,(SQLPOINTER)(rgbValue),0);
//直接连接数据源
//如果是windows身份验证,第二、三参数可以是
,也可以是任何字串
//SQL_NTS即"
retcode=SQLConnect(hdbc,datasource,SQL_NTS,user,SQL_NTS,pwd,SQL_NTS);
//分配语句句柄
retcode=(hdbc,&hstmt);//等介于(SQL_HANDLE_STMT,hdbc,&hstmt);
//直接执行查询语句
retcode=(hstmt,search,SQL_NTS);
//将数据缓冲区绑定数据库中的相应脊尘字段(i是查询结果集列号,queryData是绑定缓冲区,BUFF_LENGTH是缓冲区长度)
SQLBindCol(hstmt,i,SQL_C_CHAR,queryData[i-1],BUFF_LENGTH,0);
//遍历结果集到相应缓冲区queryData
SQLFetch(hstmt);
/*
*对遍历结果的相关操作,如显示等
*/
//注意释放顺序,否则会造成未知错误!
(SQL_HANDLE_STMT,hstmt);
(hdbc);
(SQL_HANDLE_DBC,hdbc);
(SQL_HANDLE_ENV,henv);
}
‘贰’ MySQL的各种网络IO超时的用法和实现
在MySQL的C API中,通过mysql_options函数调整mysql_init创建的连接对象属性,可以设置连接和读写操作的超时时间,单位为秒。这些选项包括MYSQL_OPT_CONNECT_TIMEOUT、MYSQL_OPT_READ_TIMEOUT和MYSQL_OPT_WRITE_TIMEOUT。如果在规定时间内未收到服务器响应,C API的查询函数会返回超时错误。
配置文件中,通过connect-timeout和interactive-timeout分别设置连接和交互超时,连接超时在连接mysql server时生效,而interactive-timeout则影响交互式连接的会话超时,通常用于手动操作,优先于客户端自定义值。
MySQL Server内部涉及多个与网络IO相关的超时变量,如connect_timeout、net_read_timeout、net_write_timeout、slave_net_timeout、interactive_timeout和wait_timeout。connect_timeout在登录阶段作为网络读写超时,而net_read_timeout和net_write_timeout在会话期间用于处理读写操作的超时。slave_net_timeout应用于slave与master的通信,wait_timeout则是会话默认超时,interactive_timeout则会作为wait_timeout的设置值。
实现超时的方法依赖于系统调用,如Linux的connect()和poll(),通过设置非阻塞模式并设置超时参数来实现。连接超时通过vio_socket_connect()和vio_io_wait(),读写超时则通过vio_read()、vio_write()和vio_socket_io_wait()配合MSG_DONTWAIT标志进行。会话超时在服务器端通过检查THD类的会话状态来实现,当超时达到,相关会话将被销毁。