[pgsql-jp: 28313] Re: postgresqlとの接続エラー

Tamotsu Ebina ebina @ pluto.dti.ne.jp
2002年 12月 14日 (土) 02:52:34 JST


> program2 では
> DataBase Connect Failed ClassNotFoundException
> とエラーがでる。

servletの実行ならservletエンジンの指定するライブラリに
postgresql.jar をコピーしておく必要があります。
TomCat なら 各アプリケーションの WEB-INF/lib の下か TomCatの lib
(使用しているservletエンジンを調べてください)
 

> program3ではNullPointerException が発生しているようです。
> 
> いったい、 ドライバのロードエラーなのかDBコネクションの接続エラー
> なのかどちらかよくわかりません。
> エラーを特定するいい方法が御座いましたらご教授お願いいたします。

urlname, user, pwd が正しければ program3自体は正しく動きます。
ただし、どれかが間違っていると、コネクト出来ず、
Statement stmt = con.createStatement();
で con が null なのでNullPointerException が発生します。

このコーディングではコネクトできたか?とチェックの意味で
            if (con == null) {
                System.out.println("error");
                show(req,resp,"error",null);
                return;
            }
としていますが、コネクトできないときは SQLException が発生しますから
制御はこの if 文へは渡りません。(このチェックは意味が無いので不要です)
次に下で、せっかく try catch しても
System.out.println(rtn_msg); または
e.printStackTrace();
しているだけなので、制御は次へ渡ってしまいます。

一番簡単な方法は、致命的なエラーが発生したら
下記のように ServletException を throw します。
プログラムはそれ以上実行されず、制御はservletエンジンへ戻ります。

        } catch ( ClassNotFoundException e) {
            e.printStackTrace();
            throw new ServletException();
        } catch ( SQLException e) {
            e.printStackTrace();
            throw new ServletException();
        } // end of catch

するとブラウザには

javax.servlet.ServletException
	at Bookmark2.doPost(Bookmark2.java:51)

と表示され、すぐexception の発生したソースファイルのライン数が分かります。

       System.exit(-1);

で抜けてしまうと、ブラウザには「ページを表示できません」としか表示されません
から 通常servletを止める時は ServletException を投げます。


printStackTrace();はブラウザには表示されませんが、servletエンジンの出力、
TomCatなら標準出力に、例えば ユーザIDが違えば。

ava.sql.SQLException: FATAL 1:  user "tamo" does not exist
        at org.postgresql.Connection.openConnection(Unknown Source)
        at org.postgresql.Driver.connect(Unknown Source)
        at java.sql.DriverManager.getConnection(DriverManager.java:512)
        at java.sql.DriverManager.getConnection(DriverManager.java:171)
        at Bookmark2.doPost(Bookmark2.java:38)

と表示されます。
ブラウザの出力だけでなく、こちらも確認しましょう。
なぜコネクトできないかの直接原因はこちらで分かります

いずれにしろJavaの例外処理 try catch thorw を正しく使う必要があります。

海老名
--
office  ta.ebina @ po1.iftc.co.jp  http://www.iftc.co.jp/
private ebina @ pluto.dti.ne.jp  http://www.pluto.dti.ne.jp/~ebina/
[Amateur Radio Station JCG#11007 JA1QKK ] Tamotsu Ebina


> -----------program3----------------------
>         try {
>           // ドライバクラスをロード
>           Class.forName("org.postgresql.Driver"); // PostgreSQLの場合
> 
>           // データベースへ接続
>           con = DriverManager.getConnection(urlname,user,pwd);
>           rtn_msg = "DataBase Connect OK";
>           if (con == null) {
>               System.out.println("error");
>                show(req,resp,"error",null);
>                return;
>           }
>           }catch ( ClassNotFoundException e) {
>               rtn_msg = "DataBase Connect Failed : " + e;
>               System.out.println(rtn_msg);
> 
>       } // end of catch
>           catch ( SQLException e) {
>            e.printStackTrace();
> 
>       } // end of catch




pgsql-jp メーリングリストの案内