使用 JDBC 连接到 PostgreSql 的本地实例
我在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
除了其他答案之外,请注意默认情况下 Postgres 配置为接受通过 Unix 套接字的连接,并根据您的操作系统帐户进行身份验证,这就是 psql 工作正常并且不需要密码的原因。
JDBC 连接是通过 TCP/IP 使用密码身份验证进行的,因此您需要相应地修改 pg_hba.conf。例如,此行允许使用密码身份验证的所有用户从同一台计算机到所有数据库的 TCP/IP 连接:
添加此行后,
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: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:
官方文档中对此进行了全部解释。
这是相关部分:
It's all explained in official documentation.
This is the relevant part:
我的问题是通过使用 pg_hba.conf 中的此设置修复的。可以在你的身上试试。
Mine was fixed by using this setting in
pg_hba.conf
. Can try it on yours.