我正在编写一个查询PostgreSQL数据库的Java程序。我正在关注this example并遇到麻烦:
connection = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1:5432/testdb", "mkyong",
"123456");
根据JavaDoc for DriverManager,第一个字符串是“jdbc:subprotocol:subname
格式的数据库网址。当我连接到服务器时,我输入psql -h dataserv.abc.company.com -d app -U emp24
并输入密码{{1} (例如,清酒)。qwe123
的第一个参数应该是什么?
我试过
getConnection
并获取运行时错误:connection = DriverManager.getConnection(
"jdbc:postgresql://dataserv.abc.company.com", "emp24",
"qwe123");
。
我下载了JDBC4 Postgresql驱动程序,版本9.2-1000。
修复我的程序以使用no suitable driver found
加载驱动程序后,它识别出JDBC URL但仍然无法连接。我现在有一个新错误。
当我运行程序时出现错误,这里是带有堆栈跟踪的输出:
Class.forName("org.postgresql.Driver");
我格式化-------- 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
的网址,如下所示:
getConnection
答案 0 :(得分:4)
很可能您未能使用DriverManager注册JDBC驱动程序,因此JDBC不知道如何处理jdbc:postgresql:
。在尝试使用Class.forName("org.postgresql.Driver");
之前,请尝试DriverManager.getConnection
。这在您链接到的示例代码中显示(它是第一行),在DriverManager documentation的序言中进行了解释,并在下面链接的PgJDBC文档中进行了详细说明。
或者,也许你已经错误jdbc:postgresql:
,因此DriverManager正在寻找一个名为postgrsql
或Postgresql
的驱动程序或其他东西,这些驱动程序将不会被注册。
最后,您可能会吞下一个类加载异常,因此驱动程序加载失败并且您没有看到它,就像这个(非常糟糕的)代码一样:
// Very bad code, never do this
try {
Class.forName("org.postgresql.Driver");
} catch (ClasNotFoundException ex) {}
从不执行上述操作。在未经检查的运行时异常中包装异常,或者只是将throws ClasNotFoundException
添加到方法定义中。
根据PgJDBC documentation和FAQ,要使用驱动程序,您必须:
CLASSPATH
; Class.forName("org.postgresql.Driver");
,以便在DriverManager中注册; 这些都是手册的链接。
有关CLASSPATH
的更多信息,请参阅wikipedia
JavaDoc和JDBC tutorial讨论了JDBC DriverManager
。
对于PostgreSQL的JDBC URL格式,that's in the documentation too。
使用JDBC,数据库由URL(统一资源)表示 定位器)。使用PostgreSQL™,它采用以下形式之一:
jdbc:postgresql:database
jdbc:postgresql://host/database
jdbc:postgresql://host:port/database
文档继续解释每个参数的含义和可选的连接参数。
从这里你可以看到,在回答你对John Woo的回答的评论时,如果你的服务器正在监听默认的PostgreSQL端口,那么你不必指定端口连接psql
时,您不必指定端口。
这使您的getConnection
参数正确,问题是您没有先注册驱动程序。
答案 1 :(得分:1)
确保您的pg_hba.conf文件包含本地连接条目,如下所示:
local mydatabasename myusername password