- PR -

修正:JAVAからデータベースへのアクセス

投稿者投稿内容
tk919
会議室デビュー日: 2005/09/03
投稿数: 13
投稿日時: 2005-09-15 09:47
すみません、先ほど投稿させていただいたのですが、
変な顔文字が混じってしまったので、再度投稿させて頂きます。

はじめまして、宜しくお願いいたします。

現在、JavaプログラムからPostgresSQLにアクセスしようと試みております。
環境は以下の通りです。

OS:Redhat7.3
J2SDK:1.4.2_09
PostgreSQL:postgresql-7.3.3
JDBC:pg73b1jdbc3.jar(rpmパッケージに含まれていたもの)

上記環境で、Javaのソースをコンパイルして実行するとエラーが表示されます↓

[root@localhost javahello]# javac HelloWorldJDBCPostgreSQL.java
[root@localhost javahello]# java HelloWorldJDBCPostgreSQL  
java.lang.ClassNotFoundException: org.postgresql.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:141)
at HelloWorldJDBCPostgreSQL.main(HelloWorldJDBCPostgreSQL.java:



JDBCのドライバ(rpmパッケージに含まれていたもの)が原因かと思い、
学習の参考にしていたURLに載っている別のドライバも
追加してみたのですが結局同じエラーとなってしまいました。

何が原因でしょうか?どなたかご教授の程、宜しくお願い申し上げます。


__参考:./bash_profileの中身抜粋_____________________

CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/usr/local/tomcat/common/lib/servlet.jar
pg73b1jdbc3.jar:jdbc7.1-1.2.jar

export JAVA_HOME PATH CLASSPATH
_________________________________


__参考:Javaのソース(HelloWorldJDBCPostgreSQL.java)________

import java.sql.*;

public class HelloWorldJDBCPostgreSQL {
public static void main(String[] args) {
try {
// ドライバクラスをロード
Class.forName("org.postgresql.Driver"); // PostgreSQLの場合

// データベースへ接続
Connection con =
DriverManager.getConnection("jdbc:postgresql:hellodb",
"postgres",
""); // PostgreSQLの場合

// ステートメントオブジェクトを生成
Statement stmt = con.createStatement();
String sql = "SELECT * FROM HELLO_WORLD_TABLE";
// クエリーを実行して結果セットを取得
ResultSet rs = stmt.executeQuery(sql);
// 検索された行数分ループ
while(rs.next()){
// NOを取得
int no = rs.getInt("NO");
// 言語を取得
String lang = rs.getString("LANGUAGE");
// メッセージを取得
String msg = rs.getString("MESSAGE");
// 表示
System.out.println(no + " " + lang + " " + msg);
}
// データベースから切断
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
___________________________________


※参考URL:http://www.hellohiro.com/jdbcpostgresql.htm
ハツキタツミ
大ベテラン
会議室デビュー日: 2005/05/24
投稿数: 108
投稿日時: 2005-09-15 09:59
FAQですな..
>java.lang.ClassNotFoundException: org.postgresql.Driver
JDBCドライバにクラスパスが通っていません。

JDBCのjarをどこにおいてますか?

#というか、エラーメッセージを読まないor読めない人が多すぎ..

[ メッセージ編集済み 編集者: ハツキタツミ 編集日時 2005-09-15 10:00 ]
takashi
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 79
お住まい・勤務地: 東京
投稿日時: 2005-09-15 10:21
こんにちは。

引用:

CLASSPATH=.:$JAVA_HOME/lib/tools.jar:/usr/local/tomcat/common/lib/servlet.jar
pg73b1jdbc3.jar:jdbc7.1-1.2.jar

export JAVA_HOME PATH CLASSPATH



このCLASSPATH設定だと、jdbcがカレントディレクトリにないとだめなようですが、そうなってますか?
あと、servlet.jarとpg73b1jdbc3.jarの間にコロン(:)がないですが、これはコピペミスでしょうか?

参考にされ他サイトでは、
引用:

◆JDBCドライバのCLASSPATHへの追加
上でインストールしたpostgresql-jdbcにJDBCドライバが入っています。/usr/share/pgsql/の下のjdbc7.1-1.2.jarというファイルをCLASSPATHに設定してください。設定方法はアプリケーション編を参考にしてください。
設定する値 →  /usr/share/pgsql/jdbc7.1-1.2.jar



となってますので、CLASSPATHには/usr/share/pgsql/jdbc7.1-1.2.jarを設定することになると思います。
以上ご参考になれば。
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2005-09-15 10:23
PostgreSQLのjdbc接続はやったことないですが、

>java.lang.ClassNotFoundException: org.postgresql.Driver
を見て
1)このクラスが自分の環境でロードできるかの単純なプログラムをつくってみる。
2)このクラスのファイルがpg73b1jdbc3.jar:jdbc7.1-1.2.jarのいずれかに
  はいってないか見てみる。

あたりをとりあえずして、ロードできない。見つからない。なら

3)どこにはいっているべきクラスファイルか?それらしきjarとかは見当たらないか?
4)そもそも、このクラスが使用されること自体誤っているのか?
なんかを疑ったり、考えたりします。

で、pg73b1jdbc3.jar:jdbc7.1-1.2.jarのいずれかにあるんですかね?
それなら、なぜロードできないのかクラスパスの設定を疑うとか。

progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2005-09-15 10:29
あっ、でも
1つ前の私のやったようなことしなくても、ここにカキコすれば
2、3みたいな原因とか確認方法までアドバイスもらえるんですね。
面倒なこと考えたり、したりしないで投稿するほうが賢いかな?
でもカキコするのは、それはそれで手間ですけど。
さる
ぬし
会議室デビュー日: 2005/07/14
投稿数: 276
お住まい・勤務地: 実家戻ったw
投稿日時: 2005-09-15 10:36
引用:

progmanさんの書き込み (2005-09-15 10:29) より:
あっ、でも
1つ前の私のやったようなことしなくても、ここにカキコすれば
2、3みたいな原因とか確認方法までアドバイスもらえるんですね。
面倒なこと考えたり、したりしないで投稿するほうが賢いかな?
でもカキコするのは、それはそれで手間ですけど。



・・・(・・)
エラーメッセージを読めば良いのでは?
もしくは参考書籍か参考サイトを見れば良いのでは?
書き込む手間も省けますよ。

# tk919さんへの書き込みではありません、あしからず。

[ メッセージ編集済み 編集者: さる 編集日時 2005-09-15 10:39 ]
tk919
会議室デビュー日: 2005/09/03
投稿数: 13
投稿日時: 2005-09-15 11:00
みなさん、ご返答ありがとうございます。感謝感謝でございます。

お恥ずかしいばかりですが、パスを通したつもりが通っておりませんでした。。
パスを修正後に再度実行したところ、お蔭様で先程までのエラーは無くなりました。
しかし、今度は次のエラーが。。。。

[root@localhost javahello]# java HelloWorldJDBCPostgreSQL
A connection error has occurred: FATAL: Password authentication
failed for user "postgres"

at org.postgresql.jdbc1.AbstractJdbc1Connection.openConnection(AbstractJ
dbc1Connection.java:196)
at org.postgresql.Driver.connect(Driver.java:120)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at HelloWorldJDBCPostgreSQL.main(HelloWorldJDBCPostgreSQL.java:14)

上記のエラーから、今度はpostgresユーザから実行してみました。
※今まではrootで実施しておりました

[root@localhost javahello]# su postgres
bash-2.05a$ java HelloWorldJDBCPostgreSQL ←パーミッション権限は付与済み
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldJDBCPostgreSQL

上記のエラーが表示されてしまいます。。

ちなみに、PostgreSQLだけは以下のサイトを参考にしてインストールを
行ったのですが、TCP/IPの接続やセキュリティの設定に問題があるのでしょうか?

※参考URL
http://www.itmedia.co.jp/enterprise/0307/18/epn20_13.html(セキュリティ設定)
http://www.itmedia.co.jp/enterprise/0307/18/epn20_12.html(TCP/IP接続)

再度、お気付きの点がございましたらご指摘願います。

宜しくお願い申し上げます。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-15 11:09
実行するユーザではなく、接続時に渡すプロパティの問題ではないでしょうか。
正しくパスワードを設定していますか?

スキルアップ/キャリアアップ(JOB@IT)