サーブレットで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>
No.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を置いても、参照されることは
ありません。
回答をありがとうございます。
>どこでも動くように作るのが基本といえると思います。
>その点からすれば、servlet.jarなど、コンテナ独自の
>ものはアプリケーションでは持たない方が良いといえますよね。
といわれるようになるほど別のサンプルアプリケーション/libを覗いてみると確かにTomcatで使用するもの以外のstruts.jarやvelocity関連などのjarしかデプロイされておりませんでした。逆に言うとものすごく基本的なことをまだまだ理解できていなかったのが非常に恥ずかしいです。うまくできなかったときにより注意深くみて考えていかなくてはいけないと痛感しました。
でも今回はnattoumakiさんのおかげで本当に助かりました。ありがとうございました。また,こちらへ投稿するときがあるかと思いますが,そのときはよろしくお願い致します。
No.3ベストアンサー
- 回答日時:
コネクションは取得できていますね。
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()) {
....
}
あと、各リソースのクローズ処理など・・・。
こんな感じですが、実際のソースとエラーが出た
場所を教えていただければわかると思います。
ありがとうございます。
どうやら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をデプロイしなければならない,という意識がずっとあったのですがこの辺りの考え方というのは間違った考え方なのでしょうか。ちょっとヒントをいただけると助かります。
でも今回は大変勉強になりました。いろいろとありがとうございました。
No.2
- 回答日時:
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]現在のカーソル位置では無効な操作です。
この内容の「カーソルの位置」とはどこを指しているのですか?
なんとも初歩的な内容で申し訳ありませんが,よろしくお願いいたします。
No.1
- 回答日時:
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ドライバーのヘルプを参考にしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript JavascriptからSQLへ繋ぎ方が分からない 3 2022/07/07 00:27
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォーム上で押されたボタンに...
-
JSP+Servletで終了ボタン
-
「<c:forEach タグが終了し...
-
HashMapで、valueにマッピング...
-
jspファイルにjavaファイル...
-
apacheとtomcat連携時において...
-
JAVA JSPにてSQL UPDATE文が実...
-
int型の内容をbyteの配列にコピー
-
jspファイルで注文フォームの合...
-
checkboxのvalue値を動的にしたい
-
JSPで<A HREF=
-
動的に作成したラジオボタンの...
-
JSPで複数テーブルのSQL実行後...
-
フォームで同じ複数のnameで違...
-
struts bean:defineについて
-
j-axis 腕時計のアラーム止めたい
-
jspからServletを呼び、元のjsp...
-
プログラミングで例えばゲーム...
-
腕時計の時報をならないように...
-
ActiveWorkbook.Pathの一つ下の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
リクエストに応じたselectedの...
-
フォーム上で押されたボタンに...
-
フォームで同じ複数のnameで違...
-
int型の内容をbyteの配列にコピー
-
「<c:forEach タグが終了し...
-
ラジオボタンの選択肢をサーブ...
-
javaでDBから取得したデータのJ...
-
StrutsでPOSTのデータ(リクエ...
-
Servletへフォームから配列を送...
-
JSPでのリストボックス表示
-
strutsを使用したjspでjavascri...
-
EL式 true falseを表示
-
JSPで複数テーブルのSQL実行後...
-
JSP+Servletで終了ボタン
-
JSPとサーブレット間での画面遷...
-
JSPでのサブミット判定
-
テキストボックスで入力したデ...
-
jspの文字化けの解消方法を教え...
-
ボタンクリック-JSP判断
-
jspでjavascript関数へ引数を渡...
おすすめ情報