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(たとえば、sake)。最初の引数は何にする必要があり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

getConnection次のように URL をフォーマットします。

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

4

2 に答える 2

4

ほとんどの場合、JDBC ドライバーを DriverManager に登録できなかったため、JDBC は を処理する方法を知りませんjdbc:postgresql:Class.forName("org.postgresql.Driver");使用する前に試してくださいDriverManager.getConnection。これは、リンク先のコード例 (最初の行) に示され、DriverManager ドキュメントのプリアンブルで説明されており、以下にリンクされている PgJDBC ドキュメントでも詳細に説明されています。

または、入力ミスをした可能性があるため、DriverManager は、またはまたは何かjdbc:postgresql:という名前のドライバーを探していますが、登録されません。postgrsqlPostgresql

最後に、次の (非常に悪い) コードのように、クラスの読み込み例外を飲み込んで、ドライバーの読み込みが失敗し、それが表示されない可能性があります。

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

上記は絶対にしないでください。未チェックの実行時例外で例外をラップするかthrows ClasNotFoundException、メソッド定義に追加するだけです。


PgJDBC のドキュメントFAQに従って、ドライバーを使用するには、次のことを行う必要があります。

これらはすべてマニュアルへのリンクです。

の詳細については、ウィキペディアCLASSPATHを参照してください

JDBCDriverManagerについては、JavaDocおよびJDBC チュートリアルで説明されています。


PostgreSQL の JDBC URL 形式については、ドキュメントにも記載されています

JDBC では、データベースは URL (Uniform Resource Locator) で表されます。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 に答える