• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JavaとSQLServer2000の接続について)

JavaとSQLServer2000の接続について

このQ&Aのポイント
  • JavaとSQLServer2000を接続する方法についての質問です。Tomcatエラー表示「NameNotFoundException 名前"Java:comp"がデータソースにバインドしておりません」が出ており、接続が確立できません。エラーの内容や対策、接続設定の確認事項を教えてください。
  • TomcatでJavaとSQLServer2000を接続しようとしていますが、NameNotFoundExceptionのエラーが出て接続できません。Tomcatの設定ファイルやjarファイルを確認しましたが、問題はありませんでした。エラーの内容や対策について教えてください。
  • Tomcat4.1.30でJavaとSQLServer2000を接続する際にNameNotFoundExceptionエラーが発生しており、接続が確立できません。Tomcatの設定やjarファイルを確認したり、接続設定の確認を行いましたが、問題は見つかりませんでした。エラーの詳細や対処方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答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()) { .... } あと、各リソースのクローズ処理など・・・。 こんな感じですが、実際のソースとエラーが出た 場所を教えていただければわかると思います。

goldchildren
質問者

お礼

ありがとうございます。 どうやら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をデプロイしなければならない,という意識がずっとあったのですがこの辺りの考え方というのは間違った考え方なのでしょうか。ちょっとヒントをいただけると助かります。 でも今回は大変勉強になりました。いろいろとありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答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を置いても、参照されることは ありません。

goldchildren
質問者

お礼

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

すると、全ての回答が全文表示されます。
回答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要素 の間あたりです。

goldchildren
質問者

補足

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のサンプルソースをここへアップして いただければ多少は原因がわかるかもしれません。

goldchildren
質問者

補足

ご返答ありがとうございます。 補足として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