使用vibe-d与mysql-native在D语言中连接MySQL失败问题排查
解决vibe-D连接MySQL时出现的IPv6连接拒绝问题
这问题我之前踩过坑!核心原因是vibe-D默认的网络栈会优先尝试IPv6连接,而你的MySQL大概率只开启了IPv4的监听(绑定了127.0.0.1),没配置IPv6支持,所以连接[0:0:0:0:0:0:0:1]:3306(IPv6版的localhost)时被拒绝。
快速解决方法(推荐):强制使用IPv4地址连接
把代码里的"localhost"替换成"127.0.0.1",直接指定IPv4的回环地址,这样vibe-D就不会去尝试IPv6连接了:
import std.stdio; import mysql; import vibe.d; void main() { // 把localhost改成127.0.0.1 MySQLPool db_pool = new MySQLPool("127.0.0.1","root","","dbname",3306); Connection db = db_pool.lockConnection(); // 如果用连接字符串的话,同样修改host: // string connectionStr = "host=127.0.0.1;port=3306;user=root;db=dbname"; // db = new Connection(connectionStr); }
备选方案:开启MySQL的IPv6监听
如果你希望保留localhost的写法,可以修改MySQL的配置文件(my.cnf或my.ini),把bind-address设置为支持IPv6的地址:
# 允许监听所有IPv4和IPv6地址 bind-address = :: # 或者只监听回环地址的IPv4和IPv6 bind-address = 127.0.0.1,::1
修改后重启MySQL服务,这样vibe-D尝试IPv6连接时就能成功了。
为什么不用vibe-D时能正常连接?
Phobos(D语言标准库)的套接字实现默认会优先尝试IPv4,或者在IPv6连接失败时自动回退到IPv4;而vibe-core(vibe-D的核心依赖)的网络模块默认优先使用IPv6,当MySQL没监听IPv6的[::1]地址时,就会抛出连接拒绝的错误。
内容的提问来源于stack exchange,提问作者GTO
相关产品推荐
相关产品推荐

