PgJDBC:在找到教程时“找不到合适的驱动程序”,为什么?

时间:2012-10-28 02:43:04

标签: 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格式的数据库网址。当我连接到服务器时,我输入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

2 个答案:

答案 0 :(得分:4)

很可能您未能使用DriverManager注册JDBC驱动程序,因此JDBC不知道如何处理jdbc:postgresql:。在尝试使用Class.forName("org.postgresql.Driver");之前,请尝试DriverManager.getConnection。这在您链接到的示例代码中显示(它是第一行),在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

JavaDocJDBC 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