MySQL 连接中 IP 或端口错误导致连接超时的解决方案

  在 Visual Studio 中调用 mysql_real_connect() 函数连接 MySQL 过程中,当仅有连接 IP 错误时,会存在大概 20 秒的连接超时,最后连接失败;当有连接端口错误时,会存在大概 60 秒连接超时,最后连接失败。

  通过在 mysql_real_connect() 前配置以下函数:

  mysql_options(handle, MYSQL_OPT_CONNECT_TIMEOUT, timeOut)

  但并不能成功在超时时间之后,结束连接请求。

  这里提供一种线程解决方案,如下:

 1 struct MySqlConnOpts_t
 2 {
 3     MYSQL* pConnHandle;
 4     std::string strIp;
 5     std::string strUserName;
 6     std::string strPassWord;
 7     int nPort;
 8     int nErrNum;
 9
10     MySqlConnOpts_t()
11     {
12         pConnHandle = NULL;
13         strIp = "";
14         strUserName = "";
15         strPassWord = "";
16         nPort = -1;
17         nErrNum = -1;
18     }
19 };
20
21 MySqlConnOpts_t* pConnectOptions = new MySqlConnOpts_t;
22 // pConnectOptions 中 pConnHandle、strIp、strUserName、strPassWord、nPort 的初始化;
23
24 DWORD WINAPI mysqlConnect(LPVOID lpParam)
25 {
26     DWORD ret = 0;
27     MySqlConnOpts_t* pConnOpts = static_cast<MySqlConnOpts_t*>(lpParam);
28
29     if(NULL == mysql_real_connect(pConnOpts->pConnHandle, pConnOpts->strIp , pConnOpts->strUserName, pConnOpts->strPassWord, pConnOpts->nPort, NULL, CLIENT_MULTI_STATEMENTS))
30     {
31           ret = -1;
32     }
33
34     pConnOpts->nErrNum = ret;
35
36     return ret;
37 }
38
39 const int nTimeOut = 1000;  // 超时设置,单位为 ms;
40 HANDLE hThread = CreateThread(NULL, 0, mysqlConnect, pConnectOptions, 0, NULL);
41 DWORD dwRet = WaitForSingleObject(hThread, nTimeOut);
42 CloseHandle(hThread);
43
44 if(0 != dwRet)
45 {
46     // 处理超时逻辑;
47 }
48
49 if(0 != pConnectOptions->nErrNum)
50 {
51     // 处理错误连接逻辑
52 }
53
54 // 处理 pConnectOptions 指针;

  可以解决连接超时问题。

原文地址:https://www.cnblogs.com/dishengAndziyu/p/12172795.html

时间: 2024-10-08 07:55:48

MySQL 连接中 IP 或端口错误导致连接超时的解决方案的相关文章

.net的webservice中内外网端口不一致导致无法调用的解决方案

再生产wsdl文件时重写描述文件 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Services.Description; 6 7 namespace StrongSoftManage.Web.App 8 { 9 public class SoapExtens : SoapExtensionReflector 10 {

JAVA判断ip、端口是否可连接

1.判断ip.端口是否可连接 public static boolean isHostConnectable(String host, int port) { Socket socket = new Socket(); try { socket.connect(new InetSocketAddress(host, port)); } catch (IOException e) { e.printStackTrace(); return false; } finally { try { sock

Java---&gt;判断IP和端口是否可连接

当我们通过IP和端口连接设备时,有时候为了用户体验,我们急需在几秒内给到用户回复信息,而这些就需要一些方法来判断: public void connect(String server, int servPort) throws IOException,UnknownHostException, SocketTimeoutException { InetAddress ad = InetAddress.getByName(server); boolean state = ad.isReachabl

安装mysql数据库中的技巧、错误排查以及实用命令(持续更新)

针对解压版本5.7.16(博主使用的这个版本.在某些低版本中部分命令失效) 一.初始化data目录(解压版解压后没有data目录) 在此之前mysql解压,并配置path环境变量,然后管理员cmd   输入mysqld -install 安装mysql. 初始化命令:mysqld --initialize-insecure --user=mysql 二.修改root密码,连接数据库后use mysql 1.update mysql.user set authentication_string=p

用nc检查某IP特定端口是否开放连接

nc检测端口的用法 nc -z  -w 10  %IP%    %PORT% -z表示检测或者扫描端口-w表示超时时间-u表示使用UDP协议 比如: nc -z -w 5 10.16.10.52 9901 尝试连接10.16.10.52的9901端口,超时时间位5秒.

关于mysql数据库中date time的错误问题(Error Code: 1067. Invalid default value for xxx)

在新建表的时候突然出现一个错误信息: Error Code: 1067. Invalid default value for 'start_time' 在经过一番折腾之后发现是datetime不能设置默认值,所以想要设置默认值的话我们也可以使用timestamp然后设置默认值为current_timestamp即可 不过除了在数据库中设置默认值外我们也可以在程序进行设置,如果是5.6的mysql数据库应该不存在不能设置默认值的问题

关于MySQL存储过程中遇到的一个错误

执行结果: 查询:create procedure test1(out var varchar(200)) comment '操作变量' begin set var='MySQL%Orcle%DeLL%IBM'; select replace(var,'%'... 共 0 行受到影响 执行耗时 : 0 sec 传送时间 : 0.064 sec 总耗时 : 0.065 sec -------------------------------------------------- 查询:delimit

java-检查IP和端口在超时时间内是否可以连接

检查IP和端口在超时时间内是否可以连接 /** * 检查IP和端口是否可以连接 * @param ip * @param port * @return */ private static boolean testConnect(String ip,int port) { Boolean isConnect = false; Socket connect = new Socket(); try { InetSocketAddress inetSocketAddress = new InetSock

mysql报错序号对应的错误

mysql报错序号对应的错误 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败<=================可以忽略 1008:数据库不存在,删除数据库失败<=================可以忽略 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目录导致删除数据库失败 1011:删除数据库文件失败 1012:不能读取系统表中的记录 1020:记录已被其他用户修改 1021:硬盘剩余空间不足,请加大硬盘可用空间 1022:关键