java - PgJDBC : "no suitable driver found" when following tutorial, 为什么?

标签 java sql postgresql jdbc

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

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

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

我试过了

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

并得到运行时错误:找不到合适的驱动程序

我已经下载了 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

我像这样格式化 getConnection 的 URL:

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

最佳答案

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

或者,您可能打错了 jdbc:postgresql:,所以 DriverManager 正在寻找名为 postgrsqlPostgresql 的驱动程序,或者一些不会被注册的东西。

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

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

永远不要做上述事情。要么将异常包装在未经检查的运行时异常中,要么将 throws ClasNotFoundException 添加到您的方法定义中。


根据 PgJDBC documentationFAQ , 要使用您必须的驱动程序:

这些都是手册的链接。

有关 CLASSPATH 的更多信息,请参阅 wikipedia

JDBC DriverManagerJavaDoc 中讨论和 JDBC tutorial .


关于 PostgreSQL 的 JDBC URL 格式,that's in the documentation too .

With JDBC, a database is represented by a URL (Uniform Resource Locator). With PostgreSQL™, this takes one of the following forms:

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

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

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

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

关于java - PgJDBC : "no suitable driver found" when following tutorial, 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105955/

相关文章:

postgresql - postgres中的递归函数

java - TestNG 启动时发生内部错误

javascript - 如何计算嵌套模型的属性

postgresql - postgres 中具有不同的 string_agg 问题

SQL Azure存储过程超时问题

C++ DB2 清除 QTEMP 中的非日志表

SQLite 选择哪里为空?

java - Gradle:为什么这个build.gradle.kts脚本无法产生任何Java类?

java - 使用 java 通过套接字进行通信的最佳方式是什么 - 架构

java - 如何在java中对这个数组列表进行排序