アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のサイトを参考にして、JSPからデータベースにアクセスして
ブラウザに表示させようとしています。
http://www.atmarkit.co.jp/fjava/rensai/jsp10/jsp …
実行環境は以下です
OS: Vine Linux 4.1
PostgreSQL: version 8.2.5
Tomcat: version 5.5.25
Java: Java 2 SDK, standard Edition, version 1.5.0_13

ブラウザからjspファイルにアクセスすると次のエラーがでてきます
ーーー エラー文 ーーー
HTTPステータス 500 -

type 例外レポート

メッセージ

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

org.apache.jasper.JasperException: Exception in JSP: /dbaccess.jsp:16

13: db.open();
14:
15: // メンバーを取得
16: ResultSet rs = db.getResultSet("select * from member");
17:
18: // メンバー一覧表示用のテーブル
19: String tableHTML = "<table border=1>";


Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

原因

javax.servlet.ServletException: ERROR: relation "member" does not exist
(略)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

原因

org.postgresql.util.PSQLException: ERROR: relation "member" does not exist
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1548)
(略)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
ーーー ここまで ーーー

自分が行った手順なんですが、
1、postgresユーザで'sampledb'というdbを作り、そのなかにmemberという
テーブルを作成し、select * from member; を実行したところテーブル
はありました。
2、MyDBAccess.javaは参考サイトとほぼ同じです。
コンストラクタの設定のところを以下のようにしました。
ーーーーーーーーーーーー
public MyDBAccess() {
driver = "org.postgresql.Driver";
url = "jdbc:postgresql://localhost:5432/sampledb;
user = "postgres";
password = "********";
}
ーーーーーーーーーーーー
コンパイルも通ったので
TOMCAT_HOME/webapps/####/WEB-INF/classes/atmarkitに
クラスファイルを置きました。
3、jspファイルはdbaccess.jspという名前でそのまま使いました。
TOMCAT_HOME/webapps/####/dbaccess.jsp
4、/usr/local/pgsql/data/postgresql.confの
#listen_addresses = 'localhost' を
listen_addresses = '*'
に書き換え、その後に
$ pg_ctl reload としました。
5、ブラウザから
"http://localhost:8080/####/dbaccess.jsp"
にアクセスするとエラーがでました。
例外の部分のエラーはいろいろいじっていると出たり出なかったりですが、
"relation "member" does not exist"というエラーは消えません。
自分でいろいろ調べてみたのですがうまくいかなくて行き詰まってしまいました。
どうか助言や解決策があれば教えてください。
お願いいたします。

A 回答 (4件)

> org.postgresql.util.PSQLException: ERROR: relation "member" does not exist



エラーから判断するに、JSPの問題ではなくて、データベースの問題ですね。
スキーマがpublicじゃないとかそうゆう問題かもしれないです。

Googleで「relation does not exist postgresql」をキーワードにして検索すると、参考になりそうなページが見つかりますよ。
http://www.google.co.jp/search?q=relation++does+ …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

スキーマは以下のようにpublicでした
sampledb=# \d
List of relations
Schema | Name | Type | Owner
--------+----------------------+----------+----------
public | member | table | postgres
public | member_member_id_seq | sequence | postgres

エラー文の検索は質問を投稿する前にやってみてはいました。
回答をいただいてもう一度探してみたのですが
やはり参考になりそうなページが見つかりませんでした;;

ブラウザでjspにアクセスしたとき、
ターミナルでデータベースに入っている(?)状態にこちらにも
以下のようにエラー表示されます
sampledb=# ERROR: relation "member" does not exist
STATEMENT: select * from member
LOG: unexpected EOF on client connection

やはりデータベース側の問題なのでしょうか;;

お礼日時:2007/11/16 13:19

エラーメッセージからして、やはりデータベースもしくはテーブルに何かありそうですね。


「select * from member」というSQLを
「select * from "member"」となるように、つまりテーブル名をクォートで囲む、
というのがあるようなのですが、これは試してみましたでしょうか?

あとは、原因の切り分けとして、
テーブルまたはデータベースを別のものを用意して、それでも同じかどうか
(現在作成したテーブルに問題があるかどうか)
JSPからではなく、JDBCから実行する(Tomcat側の問題があるかどうか)
といったことを確認して、どこに原因があるかを探っていく、というのがトラブル解決の基本なので、
こういったことを試してみてはどうでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
返答が遅くなってしまってもうしわけありません。

「select * from "member"」は
jspファイル内の記述ではなくてpostgresのコマンドラインですよね?
postgresのコマンドラインではクォートを付けなくても付けてもテーブルの参照はできました。
jspファイル内の記述もクォートを付けて試してみましたがエラー文が変わり解決しませんでした。そのエラー文なんですがjspファイルにアクセスして何度かリロードするとエラー文の原因の部分があったりなかったりします。これはどう解釈していいかわからず困っています。
jspファイルがコンパイルできないとは出つづけているのでやはり何か別の作業が必要なのではないかと思いました。

恐縮なのですけどJDBCから実行するというのは具体的にどういうことを意味しているのですか?
やりかたが自分ではわかりませんでした。すいません。

お礼日時:2007/11/17 22:11

>恐縮なのですけどJDBCから実行するというのは具体的にどういうことを意味しているのですか?



すみません。間違った言い方してました。JDBCから実行って当たり前ですね。
JSPではなく、Javaアプリケーションとして実行、ということです。
例えば、
http://www.atmarkit.co.jp/fjava/rensai/jdbc02/jd …
このサイトのような感じです。
TomcatやJSPを使うと、どうしてもサーバの設定などが関係して原因の特定が難しいので、
できるだけシンプルな構成で試して原因を探っていく、ということです。


>jspファイル内の記述もクォートを付けて試してみましたがエラー文が変わり解決しませんでした。
>jspファイルがコンパイルできないとは出つづけているので

う~ん、コンパイルエラーが出るのは不思議ですね。
ちなみに「select * from "member"」のクォートはエスケープして、
「select * from \"member\"」とする、くらいはありますが…
変わったエラーはどんなものでしょうか?

この回答への補足

>う~ん、コンパイルエラーが出るのは不思議ですね。
>変わったエラーはどんなものでしょうか?
エラーは最初の質問内容にのせてあるものと同じことを言ってると思うのですがそのURLを何度かリロードするとなぜか違うエラーがでることがあるのです。一応長いのですが2つ載せてみます。
ーーー 1 ーーー
HTTPステータス 500 -

type 例外レポート

メッセージ

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

org.apache.jasper.JasperException: JSPのクラスをコンパイルできません:
JSP FileName:/dbaccess.jsp
Java FileName:/usr/local/tomcat5.5.25/work/Catalina/localhost/javaroad//org/apache/jsp/dbaccess_jsp.java

JSPファイル: /dbaccess.jsp の中の6行目でエラーが発生しました
Syntax error on token "member", , expected
3: contentType="text/html; charset=euc-jp"
4: %>
5:
6: <%
7: // 内容: データベースにアクセスする
8:
9: // MyDBAccess のインスタンスを生成する


Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:98)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:435)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:298)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:277)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:265)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

ーーー 2 ーーー
HTTPステータス 500 -

type 例外レポート

メッセージ

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

org.apache.jasper.JasperException: Exception in JSP: /dbaccess.jsp:6

3: contentType="text/html; charset=euc-jp"
4: %>
5:
6: <%
7: // 内容: データベースにアクセスする
8:
9: // MyDBAccess のインスタンスを生成する


Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
原因

javax.servlet.ServletException: ERROR: relation "member" does not exist

(略)

原因

org.postgresql.util.PSQLException: ERROR: relation "member" does not exist

(略)



JSPファイルのソースも同じなのに出力が違う("原因"が出る場合と出ない場合)のがなぜなのかわかりません。

補足日時:2007/11/18 02:49
    • good
    • 0

確認したかったのは、JSPファイルでクエリ文を変更した場合のエラーの違いです。


クォートを付けた場合と付けない場合でエラーが変わっているのかと思ったためです。

少し状況を整理しましょうか。
今回の環境としては、
1.OSはVineLinux
2.データベースはPostgreSQL
3.JSPを利用してサンプルプログラムを実行している
大きく分けるとおよそこんな感じです。
原因もこのいずれかにあると思われます(おそらく)
そこで、どこが悪く、どこが悪くないかを判断するため、以前の回答で確認していたわけです。

まず、Javaアプリケーションとして実行して問題ないかどうか、ですが、
これで動作すればPostgreSQLの方はおよそ問題なさそうと判断できます。
※本当はそうとも言い切れないけど…
プログラムとしては、データベースアクセス処理とResultSetの取得(クエリの実行)、
そして最後のクローズ処理があれば細かいところはなくても良いでしょう。
例えば以下のとおりです
 // MyDBAccess のインスタンスを生成する
 MyDBAccess db = new MyDBAccess();
 
 // データベースへのアクセス
 db.open();
 
 //ResultSetの取得(クエリの実行)
 ResultSet rs = db.getResultSet("select * from member");
 
 //クエリ実行に成功したら表示
 System.out.println("データベースに接続しました。");
 
 // データベースへのコネクションを閉じる
 db.close();

こんな感じでJavaファイルを作成し手動でコンパイルし、javaコマンドで実行したらどうなるか。
JSPと同じように「relation …」の例外が出ればデータベースに何か原因があるかも知れません。

クォートの方は、
… db.getResultSet("select * from member");
と、
… db.getResultSet("select * from \"member\"");
という2つで違いがあるかどうか。
違いがあれば、このクエリの実行環境、つまりJSPやTomcatを実行する際には
テーブル名にクォートを付けないといけない、というケースがあったようなので念のためです。
(これはググったら出てきただけなので、詳細な理由は不明ですが…)



あとは最終手段に近くなりますが、先に挙げた1.2.に注目して、
・PostgreSQLで他のデータベースを作成してそちらでも試してみる
・PostgreSQLをインストールし直す(Vineだと大変かなあ…)
・別のPCで環境を作って同じ現象が出るか確認(Winだとやりやすい?)

一応、自分のPC(WinXP)でもやってみましたが、動作しました。
※かなりいいかげんに試したのでJSPが文字化けしてますが…
案外、環境をガラっと変えるとすんなり動いたりするかもしれませんね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!