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

サーブレットでJDBCデータソースを使ってDB接続をしようと試みておりますが,

<Tomcatエラー表示>
「NameNotFoundException 名前"Java:comp"がデータソースにバインドしておりません」

のエラーが出ており接続が確立できません。webアプリケーションはTomcat4.1.30を使っています。再度念のため[Tomcatフォルダ]\common\libにある接続に必要なjarと[Tomcatフォルダ]\conf\server.xmlの中身を確認し,classのDataSource名が不整合になっていないかを確認しましたが,やはり上述のエラーが出てしまいます。

そこでエラーの内容はどのようなことをさしているのかまた,このエラーへの対策もしくは接続設定の際の確認事項などをご教授していただきたくお願いいたします。

何分まだまだ勉強不足なもので補足情報が必要であればご提供します。

[server.xmlの設定]

<Resource name="jdbc/myApp" javax.sql.DataSource"/>
<ResourceParams name="jdbc/myApp">
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<parameter>
<name>password</name>
<value>AAAA</value>
</parameter>
<parameter>
<name>url</name> <value>jdbc:microsoft:sqlserver://localhost:1433;databaseName=COSMO;SelectMethod=Cursor</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>100</value>
</parameter>
<parameter>
<name>username</name>
<value>AAAA</value>
</parameter>
</ResourceParams>

A 回答 (4件)

できたようですね!


よかったです。

>今回のようなDB接続の絡むサーブレットを作成する
>場合コンテキストのWEB-INF\libにjarをデプロイ
>しなければならない・・・

↑に関しては、基本的にcommon/libにあるjarは
デフォルトでクラスパスに通されるので各アプリケーション
のlibへ置かなくても実行時に参照されるので大丈夫です。
ソースをコンパイルする時のクラスパスにさえ
通せばよいです。
各アプリケーションのlibへ置くことが”間違っている”
とは一概に言えませんが、私の考え方ではしない方が良いといえると思います。
common/libにあるモジュールたちは、J2EEの仕様に基づいて
各コンテナベンダ(jakartaなど)が独自に実装する
ものです。Tomcatのservlet.jarはTomcat専用ですし、
他のコンテナ(JRunとか、WEBLogicとか)ではそのコンテナ
専用のservlet.jar(と同様のもの)を用意しています。
作成したWEBアプリケーションは、コンテナが違っても
warなどにしてデプロイするだけで(もちろんそれぞれのコンテナ専用のサーバ側の設定は必要ですが)
どこでも動くように作るのが基本といえると思います。
その点からすれば、servlet.jarなど、コンテナ独自の
ものはアプリケーションでは持たない方が良いといえますよね。

補足ですが、(確か)Tomcatの場合は
1、環境変数のクラスパス
2、Tomcatのcommon/lib
3、Tomcatのserver/lib
4、アプリケーションのWEB-INF/lib
の順にクラスパスが参照されたと思います。
2,3の順番はちょっと怪しいですが、
おおよそこんな感じだったような・・。
なので、アプリケーションのWEB-INF/libに
servlet.jarを置いても、参照されることは
ありません。
    • good
    • 0
この回答へのお礼

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

>どこでも動くように作るのが基本といえると思います。
>その点からすれば、servlet.jarなど、コンテナ独自の
>ものはアプリケーションでは持たない方が良いといえますよね。


といわれるようになるほど別のサンプルアプリケーション/libを覗いてみると確かにTomcatで使用するもの以外のstruts.jarやvelocity関連などのjarしかデプロイされておりませんでした。逆に言うとものすごく基本的なことをまだまだ理解できていなかったのが非常に恥ずかしいです。うまくできなかったときにより注意深くみて考えていかなくてはいけないと痛感しました。
でも今回はnattoumakiさんのおかげで本当に助かりました。ありがとうございました。また,こちらへ投稿するときがあるかと思いますが,そのときはよろしくお願い致します。

お礼日時:2004/09/24 02:19

コネクションは取得できていますね。



SELECT文発行後のプログラム内
でのAPIの使用方法の誤りによる
エラーの可能性が高いです。
カーソルは、簡単にいえばselect文によって
取得されたレコード行の1行1行を参照する
もの・・という感じです。
うまい説明が思い浮かびませんが、
どのレコードも参照していないのに
ResultSetのgetStringなどを使うと
このようなエラーになる気がします。
SQLServerを使用したことがないので、
エラーメッセージの詳しい原因は
わかりませんが、おおよそ以下のような
可能性があると思います。

1、まだどのレコードも参照していないのに
  値を取得しようとした。
2、カーソルが一番最初にあるのに、前のレコード
  を見るようにカーソルを戻そうとした。
3、カーソルが一番最後にあるのに、次のレコード
  を見るようにカーソルを進めようとした。


サンプルは (データソース取得まで省略)

Connection con = ds.getConnection();
String sql = "SELECT.....";
Statement state = con.createStatement();
ResultSet result = state.executeQuery(sql);
while(result.next()) {
....
}
あと、各リソースのクローズ処理など・・・。
こんな感じですが、実際のソースとエラーが出た
場所を教えていただければわかると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
どうやらselect文でデータを取得しResultSetオブジェクトにexecuteしたまではよかったのですが,ResultSet.next()を呼び出す前にResultSet.getString()を呼び出していたのが,原因でした。
それと余談ですが,IDEはnetBeans3.6を使用しており,jarをTomcatフォルダ\common\libにデプロイしている場合Servlet.jarやtool.jarなどはコンテキストのWEB-INF\libにこれらをデプロイせずともDB接続は可能なようですね。今回のようなDB接続の絡むサーブレットを作成する場合コンテキストのWEB-INF\libにjarをデプロイしなければならない,という意識がずっとあったのですがこの辺りの考え方というのは間違った考え方なのでしょうか。ちょっとヒントをいただけると助かります。
でも今回は大変勉強になりました。いろいろとありがとうございました。

お礼日時:2004/09/22 02:56

nattoumakiです。


ソースは大丈夫そうですね。

おそらく設定の問題と思います。

少し気になったのですが、
<Resource name="jdbc/myApp" javax.sql.DataSource"/>

の部分が切れてしまっているようですが・・。

<Resource name="jdbc/myApp" auth="Container" type="javax.sql.DataSource"/>

のように書かれていますでしょうか?
あと、web.xmlにも、以下の記述があるか
確認をお願いいたします。

<resource-ref>
<res-ref-name>jdbc/myApp</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

もし無い場合は一応追加してみてください。
追加する場所はtaglib要素とsecurity-constraint要素
の間あたりです。

この回答への補足

nattoumakiさん,ありがとうございました。web.xmlの分が抜けていたので追記したらNameNotFoundExceptionは出なくなりました。
ただ,別のエラーがはかれまして,このエラーについても自分ではSQLServer側なのかな?という程度しか思い当たらずできましたらヒントでも頂けたら助かります。

<エラー内容>
[Microsoft][SQLServer 2000 Driver for JDBC]現在のカーソル位置では無効な操作です。

この内容の「カーソルの位置」とはどこを指しているのですか?
なんとも初歩的な内容で申し訳ありませんが,よろしくお願いいたします。

補足日時:2004/09/20 23:24
    • good
    • 0

Servlet側でDataSourceを取得する時のJNDI名が


間違ってませんか?

上記の設定の場合、

InitialContext context = new InitialContext();
DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/myApp");
で取得できるはずですが・・・。

Servletのサンプルソースをここへアップして
いただければ多少は原因がわかるかもしれません。

この回答への補足

ご返答ありがとうございます。
補足としてJavaのソースを公開します。一応DBアクセス用のクラスを作りBeanで実際にDBにアクセスをしてその結果をServletで表示するといった手法をとっておりますのでDBアクセスConnectionを返す部分を載せます。それ以外のソースも必要であればいってください。
[DBAccess.java]
public class DBAccess {
private static DataSource ds = null;
private static Connection con = null;
private static final String dataSource = "jdbc/myApp";
public synchronized static Connection getConnection()throws SQLException{
InitialContext ic = null;
try{
ic = new InitialContext();
if(ds == null){
ds = (DataSource)ic.lookup("java:comp/env/" + dataSource);
}
}catch(NamingException e){
e.printStackTrace();
CommonLog.Output(WebResource.getResource("web.no.dbsrc"));
con = ds.getConnection();
con.setAutoCommit(false);
CommonLog.Output("----- connection is aquired [ " + dataSource + ", " + con.hashCode() + " ]" );
return con;
}

BeanでDBAccess.getConnection()を呼び出してDB接続をしております。
DataSourceを呼び出すところはSQLServerのJDBCドライバーのヘルプを参考にしました。

補足日時:2004/09/19 01:19
    • good
    • 0

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