トッカンソフトウェア

JavaからJDBCでPostgreSQLにアクセス(コネクション取得)

JavaからJDBC経由でPostgreSQLにアクセスします。JDBCを入れるところからやります。
開発環境はEclipseを使います。

PostgreSQLのインストール~テーブル作成は前までの章を参照して下さい。


JDBCのダウンロードはスタックビルダから行えます。

Windowsのスタートメニューからスタックビルダを起動して下さい。


ここからスタックビルダの作業に入りますが、操作説明は別の場所に書いてあるので、そちらを参考にして下さい。

これでスタックビルダでJDBCのJarを入れた場合、
C:\Program Files (x86)\PostgreSQL\pgJDBCC:\Program Files\PostgreSQL\pgJDBC に入れていると
思われるので、入れたか忘れたら、ここらへんのフォルダを確認して下さい。



次にEclipseでJavaプロジェクトを作成し、以下のようなJavaソースを書きます。
				
package javaPosgre;

import java.sql.Connection;
import java.sql.DriverManager;

public class Posgre1 {
	public static void main(String[] args) {
		Connection conn = null;
		try {
			Class.forName("org.postgresql.Driver");
			conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/DB", "USER", "PASSWORD");
			conn.close();
			System.out.println("OK");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("NG");
		}
	}
}

			
上記の赤い部分は自分で書き換えて下さい。
localhost PostgreSQLのサーバ
5432 ポート
DB データベース名
USER ユーザ
PASSWORD パスワード

ここらへんの情報はパスワード以外はスタートメニューから psql を起動したときに確認できます。
psqlはこちらをご参照下さい


コンパイルは上記だけで通りますが、実行するためにはJDBCのJarをライブラリに追加する必要があります。

プロジェクトを右クリックしてBuild Path → Add External Archivesを選択します。


ファイル選択ダイアログが開かれるので、JDBCのフォルダに行き、postgresql-9.4-1204.jdbc4.jar を選択します。


追加できると Referenced Libraries に追加したJarが表示されます


それでは実行しましょう。実行に成功すると Console に OK と表示されます。

失敗パターン① JDBCのJarを参照していない。

コンソールに以下の様なメッセージが出ます。これが出たら上に書いたようにJDBCのJARをビルドパスから外部JARを追加して下さい。
				
java.lang.ClassNotFoundException: org.postgresql.Driver
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at javaPosgre.Posgre1.main(Posgre1.java:10)
NG

			

失敗パターン② PostgreSQLの接続文字が誤っている
コンソールに以下の様なメッセージが出ます。そのままやったら文字化けしてしまいました。
				
org.postgresql.util.PSQLException: FATAL: ?f?[?^?x?[?X"postgresd"??????????????
	at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:691)
	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:156)
	at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:35)
	at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
	at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:47)
	at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:30)
	at org.postgresql.Driver.makeConnection(Driver.java:414)
	at org.postgresql.Driver.connect(Driver.java:282)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at javaPosgre.Posgre1.main(Posgre1.java:11)
NG


			
PostgreSQLのエラーログ設定がデフォルトで日本語になっていたので、英語で出力するように直します。
データフォルダ直下に postgresql.conf というファイルがあるので、この中の lc_messages を'C'に設定します。

設定変更
				
#lc_messages = 'Japanese_Japan.932'			# locale for system error message
lc_messages = 'C'


			

設定変更後は以下のように英語でメッセージが出力されるようになりました。
今回はDB名をわざと間違えてみました。
				
org.postgresql.util.PSQLException: FATAL: database "postgresd" does not exist
	at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:691)
	at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:207)
	at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
	at org.postgresql.jdbc2.AbstractJdbc2Connection.(AbstractJdbc2Connection.java:156)
	at org.postgresql.jdbc3.AbstractJdbc3Connection.(AbstractJdbc3Connection.java:35)
	at org.postgresql.jdbc3g.AbstractJdbc3gConnection.(AbstractJdbc3gConnection.java:22)
	at org.postgresql.jdbc4.AbstractJdbc4Connection.(AbstractJdbc4Connection.java:47)
	at org.postgresql.jdbc4.Jdbc4Connection.(Jdbc4Connection.java:30)
	at org.postgresql.Driver.makeConnection(Driver.java:414)
	at org.postgresql.Driver.connect(Driver.java:282)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at javaPosgre.Posgre1.main(Posgre1.java:11)
NG


				
			
ユーザーを間違えた時のエラー(パスワードも同じ感じでした)
				
org.postgresql.util.PSQLException: FATAL: password authentication failed for user "postgresX"
	at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:427)
	at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:203)
	at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
	at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:156)
	at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:35)
	at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
	at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:47)
	at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:30)
	at org.postgresql.Driver.makeConnection(Driver.java:414)
	at org.postgresql.Driver.connect(Driver.java:282)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at javaPosgre.Posgre1.main(Posgre1.java:11)
NG


			

データベース名やユーザを確認する場合、スタートメニューから psql を起動してEnterキーを押していくと、これらの情報が見れます。
psqlはこちらをご参照下さい


ページのトップへ戻る