0

我正在编写一个查询 PostgreSQL 数据库的 Java 程序。我正在关注这个例子,但在这里遇到了麻烦:

        connection = DriverManager.getConnection(
                "jdbc:postgresql://127.0.0.1:5432/testdb", "mkyong",
                "123456");

根据DriverManager 的 JavaDoc,第一个字符串是“表单的数据库 url jdbc:subprotocol:subname。当我连接到服务器时,我输入psql -h dataserv.abc.company.com -d app -U emp24并提供密码qwe123(例如缘故)。第一个参数应该getConnection是什么?

我试过了

connection = DriverManager.getConnection(
                    "jdbc:postgresql://dataserv.abc.company.com",  "emp24",
                    "qwe123");

并得到运行时错误:no suitable driver found.

我已经下载了 JDBC4 Postgresql 驱动程序,版本 9.2-1000。


在我修复我的程序以加载驱动程序后,Class.forName("org.postgresql.Driver");它可以识别 JDBC URL,但它仍然无法连接。我现在有一个新错误。

当我运行程序时出现错误,这是带有堆栈跟踪的输出:

-------- PostgreSQL JDBC Connection Testing ------------
PostgreSQL JDBC Driver Registered!
Connection Failed! Check output consoleorg.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:207)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:140)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
    at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
    at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)
    at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:23)
    at org.postgresql.Driver.makeConnection(Driver.java:393)
    at org.postgresql.Driver.connect(Driver.java:267)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at DatabaseConnect.main(DatabaseConnect.java:32)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at org.postgresql.core.PGStream.<init>(PGStream.java:60)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:101)
    ... 11 more

我将 URL 格式化为getConnection

"jdbc:postgresql://dataserv.abc.company.com:5432/app"

4

2 回答 2

4

很可能您没有向 DriverManager 注册 JDBC 驱动程序,因此 JDBC 不知道如何处理jdbc:postgresql:. 在尝试Class.forName("org.postgresql.Driver");使用之前先尝试DriverManager.getConnection。这在您链接到的示例代码中显示(它是第一行),在DriverManager 文档的序言中进行了解释,并且还在下面链接的 PgJDBC 文档中进行了详细解释。

或者,也许你打错jdbc:postgresql:了,所以 DriverManager 正在寻找一个名为postgrsqlor的驱动程序Postgresql,它不会被注册。

最后,您可能正在吞下一个类加载异常,因此驱动程序加载失败并且您看不到它,就像这样(非常糟糕)代码:

// Very bad code, never do this
try {
    Class.forName("org.postgresql.Driver");
} catch (ClasNotFoundException ex) {}

千万不要做上述事情。将异常包装在未经检查的运行时异常中,或者只是添加throws ClasNotFoundException到您的方法定义中。


根据PgJDBC 文档常见问题解答,要使用驱动程序,您必须:

这些都是手册的链接。

有关 的更多信息CLASSPATH,请参阅维基百科

JavaDoc和JDBC教程DriverManager中讨论了 JDBC 。


至于 PostgreSQL 的 JDBC URL 格式,文档中也有

使用 JDBC,数据库由 URL(统一资源定位器)表示。对于 PostgreSQL™,这采用以下形式之一:

jdbc:postgresql:database
jdbc:postgresql://host/database
jdbc:postgresql://host:port/database

文档继续解释每个参数的含义和可选的连接参数。

从这里您可以看到,在回答您对 John Woo 的回答的评论时,如果您的服务器正在侦听默认的 PostgreSQL 端口,则您不必指定端口,如果您不必指定端口时与 连接psql

这使您的getConnection论点正确,问题是您没有先注册驱动程序。

于 2012-10-28T04:26:30.173 回答
1

确保您的pg_hba.conf文件有一个本地连接条目,如下所示:

local      mydatabasename  myusername  password
于 2012-10-29T01:23:33.393 回答