使用 JDBC 连接到 PostgreSql 的本地实例

Posted

技术标签:

【中文标题】使用 JDBC 连接到 PostgreSql 的本地实例【英文标题】:Connecting to local instance of PostgreSql with JDBC 【发布时间】:2011-06-01 12:56:50 【问题描述】:

我有一个在 linux 机器上运行的 PostgreSql 本地实例。当我从 shell 使用 psql 命令时,我成功登录,没有任何问题。我需要通过 JDBC 连接到 PostgreSql,但我不知道究竟应该将什么作为 url 参数传递给 DriverManager.getConnection()

它应该以jdbc:postgresql: 开头,但接下来会发生什么?

系统组告诉我创建了一个类似于用户名的数据库。例如如果我的用户是jutky,则创建了一个名为jutky 的数据库,但是当我尝试打开与jdbc:postgresql:jutky 的连接时,我收到一个错误

org.postgresql.util.PSQLException: FATAL: password authentication failed for user "jutky" :(

附加信息

当我通过psql 登录时,系统不会提示我输入密码,因此当我尝试通过 JDBC 登录时,我传递了一个空字符串作为密码 - 是否正确,或者我应该传递 null 还是什么? ?

当我在 shell 中键入 psql --help 时,我会在其余部分中看到这一行:

Connection options:
   -h, --host=HOSTNAME      database server host or socket directory (default: "/var/run/postgresql")

所以我知道我通过socket directory 连接到 PostgreSql,这对 JDBC 中的 URL 字符串有影响吗?


编辑

首先感谢您的回答。

第二:这不是我第一次使用 JDBC,尤其不是我第一次从 JDBC 连接到 PostgreSql,所以我知道一般规则并且我已经阅读了文档。但是,在所描述的情况下,如果实例通过socket directory 运行,我不确定我应该如何构造连接字符串以及我应该提供什么密码。因为当我通过psql 登录时,根本不会提示我输入密码。

提前致谢。

【问题讨论】:

【参考方案1】:

official documentation里都有解释。

这是相关部分:

String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";
Connection conn = DriverManager.getConnection(url);

【讨论】:

【参考方案2】:

除其他答案外,请注意,默认情况下 Postgres 配置为通过 Unix 套接字接受连接,并根据您的操作系统帐户进行​​身份验证,这就是 psql 工作正常且不需要密码的原因。

JDBC 连接是通过带有密码验证的 TCP/IP 建立的,因此您需要相应地修改 pg_hba.conf。例如,此行允许所有用户通过密码验证从同一台计算机到所有数据库的 TCP/IP 连接:

host    all         all         127.0.0.1/32          md5

添加此行后jdbc:postgresql:databasename 应该可以工作。

编辑:您不能通过 Unix 套接字创建 JDBC 连接,因为 PostgreSQL JDBC 驱动程序只能通过 TCP/IP 工作。创建 JDBC 连接时使用的密码是分配给您的用户的密码。如果您没有它,您可以分配它,例如,使用ALTER USER 命令。见19.3. Authentication methods。

另请参阅:

19.1. The pg_hba.conf file

【讨论】:

我已要求系统组检查该问题。感谢您的建议。 还要确保在 postgresql.conf 中启用了 listen_address = '*'。否则根本不可能建立 TCP/IP 连接(这是 JDBC 使用的,即使是本地连接) 非常感谢,确实通过配置 PostgreSql 解决了这个问题。 @axtavt 请帮我编辑 postgresql 的配置文件,我无法解决连接被拒绝错误。 如果我使用的是虚拟专用服务器,我仍然使用 127.0.0.1/32 IP 地址还是我的实际服务器的 IP 地址?

以上是关于使用 JDBC 连接到 PostgreSql 的本地实例的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 连接到 PostgreSQL 数据库时选择角色

连接到 postgresql:dbserver db 通过 JDBC 连接到 Databricks 时连接被拒绝

如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?

通过 JDBC 连接到 PostgreSQL - NetworkOnMainThreadException [重复]

通过带有 SSL 的 JDBC 连接到 Google Cloud PostgreSQL

如何设置远程连接到 postgresql 数据库的 jdbc 连接超时值?