現在、社内で勉強がてら、社内用アプリケーションを開発しております。
環境は以下です。

・Windows2003ServerR2
・Apache2.2.11
・Tomcat6
・MySQL5.1
・Java1.6
フレームワークを使わずに、JSP/サーブレットで開発しております。

submitして、ブラウザの「戻る」を何度も繰り返したりして
DB接続するサーブレットを何度も実行すると
「SQLNestedException」エラーになり、
サーバーリブート(もしくはtomcat/mysqlサービス再起動)
しない限り、アプリに接続できなくなってしまいます。

tomcatのstdout.logには、以下が出力されております。
-------------------------------------------------------↓
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:104)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)



-------------------------------------------------------↑

connectionのclose()をすれば良いようなことが、
ネットで調べてあったのですが、
射た感じの情報が
見つからなかったので、投稿させていただきました。

SJC-Pのバージョン5.0を取ってはいますが、
元々NotesDominoの開発が長く、JSPは初心者で、
申し訳ありません。

ご教示いただけるとありがたいです。

【補足】
すみません。try{}catchのcatch側に、close()を入れてませんでした。
しかし、close()を入れてないからといってサーバリブート(サービスリブート)しないかぎり、鍵が開けられないような感じになっているのは
なんか変ですね。

引き続き調べてみますが、解る方いらっしゃいましたら、よろしくお願いいたします。
他力本願かもですが、生産性向上思考で、情報ご提供お願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

携帯ブラウザの×を押されても、一定期間たてばセッションタイムアウトでsessionDestroyedメソッドが呼ばれるのではないでしょうか?(多分)


例えPCのブラウザでも電源をいきなり切れば同じ事です。
セッションタイムアウトは一定時間操作しなければ発生します。
コネクション数の上限とタイムアウトの時間を何分とるかです。
    • good
    • 0

これは正攻法では無いと思うのですが、ブラウザを閉じた時や、別の


ページを表示した時の方法の一例として取扱いください。
JavaScriptを用い、onUnloadイベントが発生した時に、セッションや
コネクションを削除するサーブレットを呼び出す方法です。
---------------
<SCRIPT language="JavaScript">
<!--
function byeWin(){
document.form1.closeWin.value = "true";
document.form1.submit();
}
//-->
</SCRIPT>

<body onUnload="byeWin()">
<form action="hoge" method="POST" name="form1">
<input type="hidden" name="closeWin" value="">
・・・
</form>
---------------

サーブレット側にて、
---------------
String closeWin = request.getParameter("closeWin");
if( closeWin.equals("true") ){
// セッション、コネクション削除
HttpSession session = request.getSession(true);
Connection con = (Connection)session.getAttribute("con");
if( con != null){
con.close();
}
session.invalidate();
}
・・・
---------------
という感じでしょうか。
(つっこみ所は多々ありますが、実際にシステムで使用してます)
ただし、携帯電話ではダメでしょうし、ブラウザ等、環境によっては
NGかもしれませんし、あくまでも一例として。

この回答への補足

お忙しい中、回答ありがとうございます。

参考にさせていただきます。

もともと作ろうとしているものが、
ケータイからもアクセス可能なシステムなので、

ケータイブラウザ側の対応も考えたいのですが、

ケータイサイトでDBを使用しているサービスは多々ありますし、

何かしらの対処の方法があると思いますので、
がんばって探してみます。

最悪、毎日リブート運用とか、バッチを仕込むのも考えます。

もし、何か方法が見つかりましたら、情報提供くださるとありがたいです。

補足日時:2009/05/26 17:56
    • good
    • 0
この回答へのお礼

すみません。補足の方に書いちゃいました。

お礼日時:2009/05/26 17:58

すみません。

No4の回答ですが、ブラウザを閉じた事を検知するのは
少々、コツがいるようです。
今、ちょっとしたサンプルが見つからない為、見つかりましたら、
提示したいと思います。
    • good
    • 0
この回答へのお礼

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

無償でお仕事を依頼しているようで、大変恐縮です。

セッションがメモリ上からガベージされるタイミングで呼ばれるなら、
セッションリスナーでいけそうな感じがしましたが。

私の方でも色々調べてみます。

万が一見つかりましたら、
情報いただけるとありがたいです。

お礼日時:2009/05/25 18:10

セッションリスナーをご存知でしょうか?


http://www.ingrid.org/jajakarta/servletapi/servl …

セッション作成時とか消滅時のタイミングで呼ばれます。
sessionDestroyedメソッドは消滅時に呼ばれます(ブラウザを閉じた時等)
インターネットで検索すると幾つかサンプルが出てきますので詳細は
そちらをご覧ください。



ご参考まで。
    • good
    • 0

この例外はDBCPのコネクションプールを受け持つメソッドで発生しています。


コネクションプールはリソースの省資源化、コネクションする際のサーバー負荷軽減などメリットがあります。
また、コネクションプールは通常、最大数が決まっています。
それをオーバーしてしまうとgetConnectionメソッドで、コネクションオブジェクトを返す事ができなくなり、
getConnectionメソッドはコネクションが空くまで(どこかのインスタンスでcloseされるまで)、待ち状態になります。
それが、ずーーーと続いてしまうとタイムアウトで例外発生という仕組みです。(恐らくcontext.xmlファイルのmaxWait設定値を超えたとき)

セッションを作って管理するのが良いと思います。
1つの接続に対し、セッションオブジェクトを生成し、
そのセッションオブジェクト内にコネクションオブジェクトを
置いておく構造にします。そして、そのセッション内に
コネクションオブジェクトがnullならgetConnectionするという
感じです。
若しくは、最初の画面からシステムの機能画面へ遷移する際に
セッションをはり、getConnectionします。
そして、済んだ後、例えば最初の画面へ戻ったとき等に、
コネクションをcloseし、セッションを無効化する。

という事で、ご参考まで。
    • good
    • 0
この回答へのお礼

皆様ご回答ありがとうございます。
初めて投稿するもので、あまりの回答の早さに驚いております。

セッションで管理するのがよさげなのですね。
ちょっとやってみます。

気になるのですが、ブラウザの「×」で閉じた場合、
セッションの破棄は「invalidate()」をされないと思うので、コネクションプールは開いたままになってしまうような気がするのですが。

ケータイでもアクセスできるようなシステムを作りたいと思ってまして、
その場合、JavaScriptのonUnloadでSubmitさせるとかはできないと思うので。

以下の2案のような対処方法があったらいいと思うのですが、なさそうですね。

・バックグラウンドでコネクションプーリングを監視するJavaプログラムとかを常駐させといて、使われてなくて開いているコネクションプーリングがあったら閉じる

・getConnectionは新規にコネクションプールを取得するメソッドですので、getActiveConnectionみたいな、開いていて使われてないコネクションを取得するメソッドがあればいいのですが、APIリファレンスを見る限りなさそうですね。

お礼日時:2009/05/25 16:55

いやいやいや


ずばりconnectionをcloseしていないのが原因よ。
データベースが接続を許可している数が
例えば50となっている場合、
connectionを50個ゲットしたら
次の51個目はゲットできないわ。

そうなると強制的にDBとのコネクションを切らない限り
次のコネクションを生成することができないのよ。
    • good
    • 0

http://atbb.jp/kurimaru/viewtopic.php?p=39

↑の状況に似てる気がします。

>今回は web アプリケーション側で、SQL を実行する度に
> BasicDataSource クラスを毎回 new していたため、その都度新たな
> JDBC 接続が生成され、プーリングされていた。
>つまり、sleep プロセスがたまる一方で、これが MySQL の max
>connections を超えたとき Nested Exception が発生した、という
>ことのよう。

DBの接続方法の部分のコードやJDBCドライバーは何を使っているのか?
とかがあればもう少し原因がわかるかもしれず。

>【補足】
>すみません。try{}catchのcatch側に、close()を入れてませんでした。
>しかし、close()を入れてないからといってサーバリブート(サービスリブート)しないかぎり、鍵が開けられないような感じになっているのは
>なんか変ですね。

そんなことはないでしょう、世の中1つの問題が複数のインシデントを引き起こしたりするもんです。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QwarファイルをEclipseにインポートしたときの障害に

warファイルにしたJavaプロジェクトをEclipseにインポートしました。
すると、エクスポート前に追加したjarファイルが無くなってエラー表示が出たのでビルド・パスにもう1度jarファイルを追加しました。
それで、エラー表示は解消されたのですが、忠告と言うのでしょうか、以下のような文章が表示されます。

重大度および説明 パス リソース ロケーション 作成時刻 Id
クラスパス・エントリー C:/Tomcat 6.0/lib/mailapi.jar は、エクスポートまたは公開されません。実行時に ClassNotFoundExceptions が発生する可能性があります。

初めは追加した場所(ここではTomcat6.0)がいけないのか、と思い、1度やりなおしてjre1.6.0_06からも試したのですが、この忠告が表示されました。
この忠告を表示されないようにするにはどうしたら良いのでしょうか。
どうぞ宜しくお願い致します。

Aベストアンサー

回答されていない質問を優先的に回答しているから
回答がついていると開いてもいなかったりするのよ。


mailapi.jarの警告をなくしたいなら
mailapi.jarをプロジェクトのlibフォルダにコピーしてきて
「プロジェクトのプロパティ」
>「Javaのビルドパス」
>「ライブラリ」
で、まず、現在設定されているmailapi.jar(C:/Tomcat 6.0/lib/mailapi.jar )を除去、
次に、「JARの追加」で先ほどlibフォルダに追加した
mailapi.jarを追加、
そして「OK」でプロパティを閉じる。

これでまたやってみて。
きっと警告が出なくなるはずよ。

QJSP/サーブレットとTomcatについて

私はJSP/サーブレットについて勉強しているのですが、
なぜJSP/サーブレットの実行エンジンにTomcatを使用するのですか?
他の実行エンジンではダメなのですか?

Aベストアンサー

フリーでインストールが楽だからと思います。またApacheと組み合わせる上での相性が良いと言うのもポイントだと思います。

昔JSP/Servletアプリケーション作成の記事を書いたとき(5,6年前だ・・・)は、ApacheにJServエンジンとGNUJSPを手動でセットアップしてましたが結構大変でした。

他の実行環境は商用のものが多く、学習用には手を出すにはちょっと高すぎるし、単純にJPS/Servletを勉強するには余計な機能が多すぎると言うのもあります。

QWarファイルの解凍について質問です。

Warファイルの解凍について質問です。

Zipファイルに変更後、解凍しました。

JSPやCSSは取り出せました。

が、サーブレットのソースがclassファイルのままなのですがjadで逆コンパイルしてソースを取り出すのでしょうか?

いろいろ調べましたがわからないのでよろしくお願いします。

Aベストアンサー

普通warファイルにソースは含めませんが。
ソースが必要なら、別途ソースも貰いましょう。

QFreeBSD Apacheの環境でサーブレットやJSPは使用できますか?

 Javaについての質問ですが
FreeBSD Apacheの環境でサーブレットやJSPは使用できますか?
FreeBSD Apacheの環境でのサーブレットやJSPの実装は存在しますか、という質問です。
Javaに詳しい方、どうかよろしくお願いいたします。

Aベストアンサー

FreeBSD上でサーブレットやJSPを動かすためには、
・Tomcatなどのアプリケーションサーバ(Javaサーバ)
・JVM(Java実行環境)
が必要です。

TomcatはJavaで書かれているためプラットフォーム非依存なので○○版、というのはありません。
(配布ファイルの圧縮形式でZip版とtar.gz版とWindows向けインストーラつきのexe版がありますが、中身のTomcat本体はどれも同じのはずです。)

次にFreeBSD用のJava実行環境ですが、次のところから入手できるようです。しかしSunのJVM仕様とどのくらい互換性があるのかわかりませんので、Tomcatが正しく動作するかというと、私にはわかりません。

参考URL:http://www.freebsd.org/ja/java/

QFC5にてxxxx.warファイルを

/usr/share/tomcat5/webapps/
に置くと
ディレクトリxxxxが自動的にできてしまいます
どうもxxxx.warが自動的に解凍されているようです
自動的に解凍されないようにすることはできるのでしょうか?

Aベストアンサー

Tomcatの設定ファイルserver.xmlで下記のような<Host>記述があると思いますが、
<Host name="YOUR-HOST-NAME" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">

これのunpackWARsやautoDeployを変更してTomcatを再起動すれば、望みの動作になるのではないでしょうか。

Q「org.apache.jsp」内のファイルは削除しても大丈夫?

サーブレットを勉強しています。Eclipseを使っています。

「org.apache.jsp」にあるjavaファイルは削除しても大丈夫なのでしょうか?削除してもJSPファイルがあれば、ブラウザから動かした時に、また問題なく動くのでしょうか?

PCが固まってしまって、強制終了したのですが、次に起動した時にそれまではエラーになっていなかった「org.apache.jsp」内のファイルがいくつかエラーになっていました。「org.apache.jsp」内のファイルというのはJSPファイルをいったんサーブレットに変換したもの(?)が格納されているのですよね?

ということは、削除しても、JSPファイルがあれば、またプログラムを動かせば新たに生成されて問題なく、動くのでしょうか?

よろしくお願いします。

Aベストアンサー

Javaファイルを削除しても問題ないです。

classファイルのタイムスタンプを比較して、Javaファイルを作成するか判定しているはずなので、classファイルも削除するほうがよいと思います。

Qwarファイルを展開するとタイムスタンプが保持されない

複数個のclassから成るWebアプリケーションをwarで固めて客先に配布しています。
ここで、クラスに不具合が見つかって修正が入ると、

1.Antでプロジェクトを一括してコンパイル
2.更新されたソースだけがコンパイルされる
3.プロジェクト全体がwarにビルドされる

という手順を踏んでいます。
が。受け取った側がwarを展開すると、ファイルのタイムスタンプが全て展開された日時になってしまいます。
これでは、相手側でどのファイルがいつ修正されたのかわからん!という事態になっており、悩んでいます。
tarだとタイムスタンプは保持されるのですが、何か良い方法はないでしょうか。

Aベストアンサー

#1です。
jarファイルはファイル形式そのものは通常のZIPファイルと同じなので、unzipコマンドやWindows用のほかのツールを使っても大丈夫です。
ものによっては拡張子を.zipに変えないと認識しないアプリケーションもあるかもしれないですが。

>classのタイムスタンプを見れば、今回何が修正されたのかわかる
Aクラスが修正されたとして、それを参照しているBやCは修正が無くてもコンパイルされます。また、BやCを参照しているDはAを直接参照していなくてもコンパイルされます。
いろいろな場所から参照されている箇所を変更した場合には、リコンパイルされるクラスの数はフルビルドと大差なくなることもあります。
ソースの変更をバイナリ(.class)ファイルのタイムスタンプなどで管理するのはJavaの性質上無理があります。

さらに蛇足ですが…一部だけのコンパイルは危険です。定数の変更がきちんと反映されないことや、開発端末との時間設定のずれによって、ソースの変更がコンパイラやツールに正常に認識されない危険があります。

コンパイル時はなるべくフルビルドを行い、変更管理はソースをきちんと管理することで行ったほうがいいです。

#1です。
jarファイルはファイル形式そのものは通常のZIPファイルと同じなので、unzipコマンドやWindows用のほかのツールを使っても大丈夫です。
ものによっては拡張子を.zipに変えないと認識しないアプリケーションもあるかもしれないですが。

>classのタイムスタンプを見れば、今回何が修正されたのかわかる
Aクラスが修正されたとして、それを参照しているBやCは修正が無くてもコンパイルされます。また、BやCを参照しているDはAを直接参照していなくてもコンパイルされます。
いろいろな場所から参照...続きを読む

Qimportするには java.io.*; import org.apache.log4j.*;

EclipseでJavaの開発をしています。
import java.io.*;
import org.apache.log4j.*;
がエラーになります。
多分ライブラリーに入れる必要があるのだと思いますが、その方法について
教えて下さい。宜しくお願い致します。

Aベストアンサー

プロジェクトフォルダを右クリック→「ビルド・パス」→「ビルド・パスの構成」
あるいはプロジェクトフォルダを右クリック→「プロパティ」→「Javaのビルド・パス」

で、ライブラリがプロジェクトフォルダ配下に存在しているなら「Jarの追加」
プロジェクトフォルダ以外の場所にあるなら「外部Jarの追加」で追加できます。

ちなみにjava.ioはJ2SEに含まれているので(「JREシステムライブラリ」があるはずなので)
追加しなくても良いです。

Qweblogicで開発するにはwarファイルの作成が必須ですか?

今weblogic8.1でwebアプリケーションを開発していますか、warで作成しアプリケーションモジュールを追加したときはjspの表示が旨く出来ますか、warで作成しなくてアプリケーションモジュールなしでソースをドメインのapplications直下に入れてる場合はhttp404エラーが表示されます。ちなみに、ソースのみでの構成は:
applications/
index.jsp
WEB-INF/
|- web.xml
-- weblogic.xml
アクセスじのパスは:
http://localhost:7001/myWeb/index.jsp -- エラー
http://localhost:7001/index.jsp -- エラー

となってます。
8.1でwarを作成しなくでjspを表示させるにはどうすれば良いのでしょか?

Aベストアンサー

以前、少しだけWebLogicでの開発に関わっただけなので、うろ覚え+検索でも曖昧なのしか見つからなかったのですが、

<BEA_HOME>\user_projects\<MyDomain>\applications\<MyWebApp>

が設置場所になると思います。

※UNIX系の場合は、"\"を"/"と置き換えていただいて。

初期状態でドメインの方は1つあったはずですが、その下のapplicationsの下に、Webアプリケーションのディレクトリを掘って、その下に置く形になります。

たとえば、

c:\bea\user_projects\mydoamin\applications\myWeb\index.jsp

だったら↓でアクセスできると思います。

http://localhost:7001/myWeb/index.jsp

ただ、WebLogicの管理画面

http://localhost:7001/console/

で、作成したWebアプリケーションを追加し手やらなければいけなかったはずです。

これらの細かい内容は、オンラインマニュアルで確認できますので、参照してみましょう。
http://edocs.beasys.co.jp/e-docs/index.html

以前、少しだけWebLogicでの開発に関わっただけなので、うろ覚え+検索でも曖昧なのしか見つからなかったのですが、

<BEA_HOME>\user_projects\<MyDomain>\applications\<MyWebApp>

が設置場所になると思います。

※UNIX系の場合は、"\"を"/"と置き換えていただいて。

初期状態でドメインの方は1つあったはずですが、その下のapplicationsの下に、Webアプリケーションのディレクトリを掘って、その下に置く形になります。

たとえば、

c:\bea\user_projects\mydoamin\applications\myWeb\index.j...続きを読む

Qeclipseを使用してTomcatのサーブレットをステップ実行でデバ

eclipseを使用してTomcatのサーブレットをステップ実行でデバックしたいのですが
なぜかhttp404エラーが出てしまいます。何かeclips側で設定が漏れているのでしょうか。

当方の使用環境は
Windows7
tomcat6.0
Apache2.2(Tomcatと連携)
eclipse pleiades All in One for java Developers 3.6
です。

手順は以下の通り行いました。

・メニューのウィンドウ→ビューの表示→サーバーを選択。
・サーバービュー上で右クリック→新規→サーバーを選択。
・表示された画面で「サーバのタイプ:tomcat6.0」を選択し、サーバのホスト名に"localhost"を入力し「完了」ボタン押下。(その他の項目はデフォルト)
・メニューのファイル→新規→動的ウェブプロジェクトを選択。
・表示された画面でプロジェクト名を入力し完了ボタン押下(その他の項目はデフォルト)
・作成したプロジェクトを右クリック→新規→その他を選択。
・表示された画面でweb→サーブレットを選択し「次へ」押下。パッケージ、クラス名を入力して「完了」ボタン押下。
・作成されたクラスのdoGetメソッドを以下のように編集。

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{

response.setContentType("text/html; charset=Windows-31J");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>テストタイトル</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>テスト</h1>");
out.println("</body>");
out.println("</html>");
}

・クラス先頭のインポート文に「import java.io.PrintWriter;」を追記。

・プロジェクトを右クリック→デバック→サーバーでデバックを選択。
・表示される画面で「既存のサーバーを選択」を選択し「次へ」ボタン押下。
・構成済みのリソースに作成したプロジェクトがあることを確認して「完了」ボタン押下。

結果「http://localhost:8080/testWeb/」に自動的にアクセスするが以下のようなメッセージが表示されてしまう。
------------------------------------------------------------------------------
HTTPステータス 404
The requested resource () is not available.

--------------------------------------------------------------------------------

※eclipseからtomcatの起動と終了は正常にできているようです。

参考にしたURL
 http://www.od.eng.kansai-u.ac.jp/docs/eclipse-tomcat-DynamicWebProject.pdf
 http://www.db.is.kyushu-u.ac.jp/rinkou/tomcat/eclipsetomcat.html

eclipseを使用してTomcatのサーブレットをステップ実行でデバックしたいのですが
なぜかhttp404エラーが出てしまいます。何かeclips側で設定が漏れているのでしょうか。

当方の使用環境は
Windows7
tomcat6.0
Apache2.2(Tomcatと連携)
eclipse pleiades All in One for java Developers 3.6
です。

手順は以下の通り行いました。

・メニューのウィンドウ→ビューの表示→サーバーを選択。
・サーバービュー上で右クリック→新規→サーバーを選択。
・表示された画面で「サーバのタイプ:tomcat6.0」を選択し、サー...続きを読む

Aベストアンサー

っていうより、TestTom.javaを右クリックで実行でできませんか?

デバッグをいきなりしようとしていますが、先ずは実行できるか確認ですね。
プロジェクトのビルドはしてますよね?自動的にビルドにチェックが入っていればOKですけど。

WTPプラグインを使っているようですので、お試しで特別なことが無い限り、web.xmlをさわる
必要ありません。

あと、エクリプスを使わないでtomcatサービスを起動してtomcatの起動画面が出るかどうかも
確認したほうが、もしかしたらよいかもです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング