【问题标题】:Spring Boot, MongoDB connection timeoutSpring Boot,MongoDB 连接超时
【发布时间】:2017-08-01 02:16:29
【问题描述】:

我有以下问题:
1. 我已经设置了使用 MongoDB 数据库的 spring boot 应用程序。
2. 我在本地进行了测试,它可以正常工作 - 应用程序正确连接到数据库。
3. 我将spring boot app部署到azure,但是app无法连接MongoDB数据库。我得到以下异常:

“在等待与 ReadPreferenceServerSelector{readPreference=primary} 匹配的服务器时超时 30000 毫秒。集群状态的客户端视图是 {type=UNKNOWN, servers= [{address=appexpirer.documents.azure.com:10250, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadTimeoutException: Timeout while received message},由{java.net.SocketTimeoutException: Read timed out}}引起;嵌套异常为com.mongodb.MongoTimeoutException: 等待与 ReadPreferenceServerSelector{readPreference=primary} 匹配的服务器时,在 30000 毫秒后超时。集群状态的客户端视图是 {type=UNKNOWN, servers= [{address=appexpirer.documents.azure.com:10250, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketReadTimeoutException: Timeout while received message},由 {java.net.SocketTimeoutException: 读取超时}}]"

我相信我的 application.properties 配置正确:

spring.data.mongodb.uri=mongodb://username:password@host:port/databaseName?ssl=true&sslInvalidHostNameAllowed=true
server.ssl.enabled=true
server.ssl.enabled-protocols=true

但我不确定 - 你能告诉我哪里出了问题吗?

如果我使用 Robomongo 工具进行连接,则一切正常。 我使用 Java 8 - 会不会有问题?

【问题讨论】:

  • 启动应用程序是如何部署到 azure 的?是否有任何可能阻止对 DocumentDb 端点的出站访问?
  • 我通过 git 部署了 app.jar 文件和 web.config 文件。我想知道 ssl 是否有问题,因为我没有在 Azure 上的应用服务上配置 ssl,而 MongoDB 需要 SSL 连接 - 你遇到过这种情况吗?
  • 我可以点击 mongo 端点,您的错误会从我的机器启动时显示。它显示身份验证错误(显然),因此连接问题似乎不是到 mongo 端点,而是来自您的启动应用程序所在的位置。
  • 我相信 azure app 服务需要 ssl 证书才能与 mongodb 通信,因为唯一的方法是使用 ssl 连接到 mongodb - 我会尝试进一步调查。
  • 终于解决了。这个问题真的很愚蠢。当我通过 git app 上传 app.jar 文件时,实际上 Azure 上并没有更新。我注意到有异常表明应用程序无法更新,因为以前的版本正在运行......我不得不手动停止进程,上传新版本,然后手动运行上传的版本。无论如何,谢谢大家的帮助。

标签: mongodb azure spring-boot java-8


【解决方案1】:

您是否打开了从应用服务器到数据库(Mongo)服务器的连接?该错误听起来像是防火墙只是丢弃了请求数据包。

Azure 和 AWS 等服务将一切都锁定得非常严密。您通常必须明确打开或允许您要使用的每个连接点。

【讨论】:

  • 你是什么意思 - “你打开了从你的应用服务器到数据库(Mongo)服务器的连接”?我已经设置了应用服务和数据库服务器。两者都是在 Azure 上设置和托管的。我应该以某种方式在 Azure 上建立这两者之间的连接吗?我可以从 Robomongo 连接到数据库,但不能从应用服务(总是获取时间戳)。
【解决方案2】:

对于部署在 AWS Beanstalk 上的 Spring Boot 服务,我遇到了类似的问题。出现问题是因为我部署了新版本,而旧版本仍在 ECS 上运行。

我不得不手动终止环境并重新部署服务。 IT 解决了这个问题。只有重新部署而不终止,于事无补。确保在新部署后再次将您的主机/域配置为 ELB。

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2016-09-13
    • 2021-03-15
    • 2017-11-14
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多