使用MySQL C++ Connector8 JDBC无法连接本地MySQL,求助
解决MySQL C++ Connector8 JDBC API连接本地MySQL失败的问题
问题描述
可通过终端命令mysql -uroot -p123456正常连接本地MySQL,但使用MySQL C++ Connector8 JDBC API时连接失败,报错信息为unable to connect to localhost,相关代码如下:
driver = sql::mysql::get_driver_instance(); try { // con = driver->connect(connection, username, password); con = driver->connect("tcp://127.0.0.1:3306", "root", "123456"); } catch (sql::SQLException e) { std::cout << e.what(); } con->setSchema("mydb");
解决方案
确认MySQL是否开启TCP/IP监听
在终端执行netstat -an | grep 3306,查看输出是否包含0.0.0.0:3306或127.0.0.1:3306。若仅显示Unix套接字(如/tmp/mysql.sock相关内容),说明MySQL未启用TCP连接:- 打开MySQL配置文件
my.cnf(Linux)或my.ini(Windows) - 将
bind-address设置为127.0.0.1,并确保skip-networking配置项被注释 - 重启MySQL服务
- 打开MySQL配置文件
验证连接字符串格式
确认连接字符串"tcp://127.0.0.1:3306"符合Connector8的要求,也可尝试替换为"localhost:3306"测试是否能正常连接。检查用户TCP连接权限
终端登录MySQL后执行以下命令,查看root用户的授权主机:SELECT user,host FROM mysql.user WHERE user='root';若root用户的
host字段仅为localhost,则仅允许套接字连接,需为127.0.0.1单独授权:GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;修复空指针异常风险
当前代码在连接失败时,con会为空指针,后续调用con->setSchema("mydb")会触发崩溃,需增加空指针判断:driver = sql::mysql::get_driver_instance(); sql::Connection* con = nullptr; try { con = driver->connect("tcp://127.0.0.1:3306", "root", "123456"); if (con != nullptr) { con->setSchema("mydb"); // 执行后续数据库操作 } } catch (sql::SQLException &e) { // 使用引用避免异常对象拷贝 std::cout << "连接错误详情: " << e.what() << " 错误码: " << e.getErrorCode() << std::endl; } // 释放连接资源 if (con != nullptr) { delete con; }检查版本兼容性
确保MySQL C++ Connector8的版本与本地MySQL服务器版本匹配,大版本不一致可能引发连接兼容性问题。
内容的提问来源于stack exchange,提问作者user3135996
相关产品推荐
相关产品推荐

