gpt4 book ai didi

java - 从本地机器到 AWS RDS PostgreSQL 数据库的连接速度非常慢

转载 作者:行者123 更新时间:2023-12-05 07:44:06 26 4
gpt4 key购买 nike

我到处寻找这个问题的答案。我找到了一个 similar (unanswered) question关于 SO 但与 Java 或 SSL 问题无关。

重要信息:

  • 我连接的数据库是 RDS 上的 PostgreSQL。
  • 我实际上可以连接到数据库(建立连接大约需要 3 分钟)。建立连接后,简单的查询需要 15-120 秒。
  • 只有从我的代码连接时才会出现问题。
  • 从 Postico(在同一台机器上)连接工作完美。
  • 将完全相同的连接部署到 AWS EC2,效果非常好。
  • 我已将 RDS 证书添加到 keystore 。
  • RDS force_ssl 参数设置为 true。
  • 注意连接字符串末尾的 + "?ssl=true" 参数。
  • 测试用直接 IP 替换域(以排除 DNS 问题)。同样的事情。

我怀疑它与 SSL 有关,但无法确认。

这是我的连接(非常标准):

    String dbUriString = ConfigUtils.getEnv("DATABASE_URL");

URI dbUri = new URI(dbUriString);

String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath() + "?ssl=true";

ComboPooledDataSource datasource = new ComboPooledDataSource();

datasource.setUser(username);
datasource.setPassword(password);
datasource.setJdbcUrl(dbUrl);
datasource.setDriverClass("org.postgresql.Driver");

datasource.setMaxPoolSize(20);
datasource.setMinPoolSize(5);
datasource.setAcquireIncrement(1);
datasource.setAcquireRetryAttempts(3);
datasource.setInitialPoolSize(5);
datasource.setTestConnectionOnCheckout(true);

return datasource;

更多信息:

  • 这是一个 Play Framework 应用程序。
  • Java 8。
  • 数据源连接器 c3p0。

非常感谢任何帮助。

最佳答案

连接到我们在 AWS 上的 Postgres 数据库最多需要一两分钟才能建立连接,然后一切正常。

原来是DNS解析的原因。

我跑了 telnet <database host> 5432并发现它正在尝试连接到 IPv6 连接。大约一分钟后,它会超时并尝试 IPv4 连接,该连接立即有效。

正在运行 dscacheutil -q host -a name <database host>在我的 macOS 机器上确实显示数据库主机已解析为 IPv6 和 IPv4 地址。

我更改了计算机上的 DNS 设置。具体来说,我告诉我的 VPN 客户端为 amazonaws.com 域使​​用谷歌的 DNS 服务器。在那之后,一切都很完美。事实上,在重新运行时 dscacheutil -q host -a name <database host> , 我这次只看到了 IPv4 地址。

不知道 IPv6 连接不工作,但缺点是 DNS 是问题的一部分。

关于java - 从本地机器到 AWS RDS PostgreSQL 数据库的连接速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43121081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com