【问题标题】:Can't connect to postgres db with jdbc无法使用 jdbc 连接到 postgres db
【发布时间】:2020-12-01 06:58:36
【问题描述】:

注意:我在这里将安全服务称为问题服务,但我怀疑我是否可以使用任何服务连接到数据库 - 安全只是必须这样做的第一个。

我正在尝试修改一个 java 应用程序以使用 postgres 而不是 oracle,我遇到了连接问题,而且我的日志没有帮助。

数据库位于远程服务器上,但其他应用程序正在成功访问它。我可以毫无问题地连接到 postgres 客户端。

我应该去哪里看看有什么想法吗?

错误:

来自我正在调用的服务:

2020-08-11 14:47:37 INFO  AuthenticationService:32 - Rest Services - starting authentication...
2020-08-11 14:47:38 ERROR AuthenticationService:119 - GetUserInfo: trying to connect to the Rest Serrvice, attempt 1, HTTP Error Code: 500
2020-08-11 14:47:38 ERROR AuthenticationService:120 - Response message: Internal Server Error
2020-08-11 14:47:38 ERROR AuthenticationService:146 - Problem getting User Info: Problem getting User Info 500, message: Internal Server Error
2020-08-11 14:47:38 ERROR AuthenticationService:62 - Problem getting User Info: Problem getting User Info 500, message: Internal Server Error

来自底层问题服务:

2020-08-11 14:47:38 INFO  SecurityService:67 - Rest Services - getUserInfo
2020-08-11 14:47:38 INFO  SecurityService:87 - Getting User Info from DB...
2020-08-11 14:47:38 ERROR SecurityService:110 - Couldn't establish connection to Database

问题服务的我的 context.xml(资源部分在两个服务中是相同的):

<?xml version="1.0" encoding="UTF-8"?>

<Context path="/PhoenixSecurity" docBase="PhoenixSecurity"
   crossContext="true" reloadable="true" debug="1">

<Resource name="jdbc/CtsRest" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
          url="jdbc:postgresql://CORRECT-IP:5432/phoenix"
          username="validUser" password="validPassword" maxActive="100" maxIdle="100" maxWait="-1"/>
</Context>

【问题讨论】:

  • JVM能到达5432端口吗?
  • 我不知道为什么它不能,但我也不确定如何轻松检查
  • 日志记录建议您自己的代码记录“无法建立与数据库的连接”,我建议您也记录实际的异常堆栈跟踪,这样您就知道是什么了错了。
  • @flammino 写一个 Jsp 小页面,手动加载驱动并建立连接,以及一个你知道返回数据的小查询。

标签: java postgresql tomcat jdbc psql


【解决方案1】:

在解决这些问题时,请按顺序检查以下内容:

  1. 你能从局域网上的另一台机器连接到 PostgreSQL 吗?如果不是,它可能没有在监听地址?

  2. 你能在本地连接吗?它还在运行吗?

现在在第二个成功而第一个失败的情况下,按顺序检查以下内容:

  1. listen_address 在 postgresql.conf 中

  2. 防火墙规则

  3. 任何可能干扰网络连接的东西。

*有时当你在 jdbc url 中传递 localhost 时,它会被映射到 ipv6 地址。尝试明确指定 ip4 地址。

【讨论】:

  • 我使用的是 IP - 数据库未在本地主机上运行。使用 psql -h [correct-ip] -U username -d phoenix 从 shell 连接到数据库确实可以在我运行 tomcat 的同一台机器上工作
  • 您还需要在 pg_hba.conf 文件中添加允许远程连接的规则。托管所有所有 0.0.0.0/0 md5
【解决方案2】:

原来我的问题是假设 postgres 的 jdbc 驱动程序可以创建与 oracle 相同的连接方式。它不能。经验教训。

【讨论】:

  • 你能更精确一点吗?使用 JDBC 创建连接的方式始终相同。您提供 URL、用户名和密码,其余的由驱动程序完成。不同驱动的代码应该没有区别
猜你喜欢
  • 2020-04-04
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2023-04-01
  • 2022-10-19
  • 2020-09-16
相关资源
最近更新 更多