You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何无法通过Devart UniDAC从Delphi连接MongoDB?

解决Devart UniDAC连接MongoDB集群超时的问题

既然你用MongoDB Compass能正常连接,但UniDAC报Failed to read 66321 bytes from socket within 300000 milliseconds的超时错误,说明集群本身和网络通路是通的,问题大概率出在UniDAC的配置细节上,试试下面这些针对性的解决方案:

  • 强制开启SSL/TLS连接
    MongoDB Atlas集群默认要求SSL加密连接,Compass会自动启用,但UniDAC的图形界面可能默认没开。打开连接编辑器,找到SSL相关配置项:

    • 勾选Use SSL选项
    • 将SSL模式设置为sslAutosslRequired
      另外,如果你的UniDAC依赖OpenSSL库,要确保libeay32.dllssleay32.dll这两个文件放在Delphi程序的运行目录,或者系统的环境变量路径里,否则SSL握手会失败导致超时。
  • 改用MongoDB SRV连接字符串
    手动填写服务器地址和端口的方式,对分片集群的兼容性不如SRV连接字符串。直接构造完整的连接字符串,然后赋值给UniConnection的ConnectionString属性:

    mongodb+srv://你的用户名:你的密码@cluster0-shard-00-00-xxxxx.mongodb.net/?retryWrites=true&w=majority
    

    这种格式会自动解析集群的所有节点、端口和SSL配置,比手动填参数更可靠。

  • 调整超时参数
    报错里的300000毫秒是默认的socket超时时间,如果你所在的网络到MongoDB集群的延迟较高,可以适当调大超时值:

    • 在UniConnection的属性里,找到ConnectTimeoutSocketTimeout,把数值改成600000(10分钟)或者更大,给连接和数据传输留足够的时间。
  • 升级UniDAC到最新版本
    老版本的UniDAC对MongoDB Atlas的分片集群支持可能存在bug,比如处理集群节点发现的逻辑不完善。去Devart官网检查你的UniDAC版本,如果不是最新版,升级后再尝试连接,新版本通常会修复这类兼容性问题。

  • 排查程序的网络权限
    虽然Compass能连,但你的Delphi程序可能被本地防火墙、杀毒软件拦截了出站连接,或者需要配置代理才能访问外部集群。可以暂时关闭防火墙测试,或者给程序添加网络访问的白名单;如果用了代理,要在UniDAC的配置里设置对应的代理参数。

如果以上方案都试过还是不行,可以抓一下Compass和UniDAC的网络请求包,对比两者的SSL握手流程、请求参数差异,这样能更精准地定位问题。

内容的提问来源于stack exchange,提问作者zac

火山引擎 最新活动