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

发布于 2024-10-09 14:07:13 字数 1091 浏览 2 评论 0原文

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

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

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

org.postgresql.util.PSQLException: FATAL: 用户“jutky”的密码身份验证失败 :(

其他信息

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

当我在 shell 中输入 psql --help 时,我会在其余内容中看到这一行:

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

所以我明白我连接了通过 socket 目录 到 PostgreSql,这对 JDBC 中的 URL 字符串有影响吗?


编辑

首先感谢您的回答,

第二:这不是我第一次使用 。 JDBC,特别是我不是第一次从 JDBC 连接到 PostgreSql,所以我知道一般规则,并且我已经阅读了文档,但是在所描述的情况下,我不确定应该如何构造连接字符串。 不会提示我输入密码。

该实例是通过 socket 目录 运行的,我应该提供什么密码,因为当我通过 psql 登录时,根本

I have a running local instance of PostgreSql on a linux machine. When I use psql command from the shell I success to log in without any problem. I need to connect to the PostgreSql via the JDBC, but I don't know what exactly should I pass as url parameter to DriverManager.getConnection().

It should start with jdbc:postgresql: but what's going next?

I was told by the system group that a database with was created like user name. e.g. if my user is jutky a db named jutky was created, but when I try to open a connection to jdbc:postgresql:jutky I get an error

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

Additional info

When I login via the psql I'm not prompted for the password, so when I try to login via JDBC I pass an empty string as a password - is it correct, or should I pass null or something?

When I type psql --help in the shell I see among the rest this line:

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

So I understand that I connect to PostgreSql via a socket directory, does that matters something to the URL string in the JDBC?


EDIT

First thanks for the answers.

Second: its not first time I'm using JDBC and in particular not the first time I'm connecting to the PostgreSql from JDBC, so I know the general rules and I have read the documentations. However in the described case I'm not sure how exactly should I construct the connection string if the instance is running via the socket directory and what password should I provide. Because when I login via the psql I'm not prompted for password at all.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眸中客 2024-10-16 14:07:13

除了其他答案之外,请注意默认情况下 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。身份验证方法

另请参阅:

In addition to other answers note that by default Postgres is configured to accept connections via Unix sockets with authentication based on your operating system account, that's why psql works fine and doesn't require the password.

JDBC connections are made over TCP/IP with password authentication, so you need to modify pg_hba.conf accordingly. For example, this line allows TCP/IP connections from the same machine to all databases for all users with password authentication:

host    all         all         127.0.0.1/32          md5

After adding this line jdbc:postgresql:databasename should work.

EDIT: You can't create a JDBC connection over Unix socket since PostgreSQL JDBC driver can only work over TCP/IP. The password you use when creating JDBC connection is the password assigned to your user. If you don't have it, you can assign it, for example, using ALTER USER command. See 19.3. Authentication methods.

See also:

丑疤怪 2024-10-16 14:07:13

官方文档中对此进行了全部解释。

这是相关部分:

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

It's all explained in official documentation.

This is the relevant part:

String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";
Connection conn = DriverManager.getConnection(url);
南风几经秋 2024-10-16 14:07:13

我的问题是通过使用 pg_hba.conf 中的此设置修复的。可以在你的身上试试。

host    all             all             0.0.0.0/0               trust
host    replication     all             0.0.0.0/0               trust

Mine was fixed by using this setting in pg_hba.conf. Can try it on yours.

host    all             all             0.0.0.0/0               trust
host    replication     all             0.0.0.0/0               trust
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文