
現在、社内で勉強がてら、社内用アプリケーションを開発しております。
環境は以下です。
・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()を入れてないからといってサーバリブート(サービスリブート)しないかぎり、鍵が開けられないような感じになっているのは
なんか変ですね。
引き続き調べてみますが、解る方いらっしゃいましたら、よろしくお願いいたします。
他力本願かもですが、生産性向上思考で、情報ご提供お願いいたします。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
携帯ブラウザの×を押されても、一定期間たてばセッションタイムアウトでsessionDestroyedメソッドが呼ばれるのではないでしょうか?(多分)
例えPCのブラウザでも電源をいきなり切れば同じ事です。
セッションタイムアウトは一定時間操作しなければ発生します。
コネクション数の上限とタイムアウトの時間を何分とるかです。
No.6
- 回答日時:
これは正攻法では無いと思うのですが、ブラウザを閉じた時や、別の
ページを表示した時の方法の一例として取扱いください。
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を使用しているサービスは多々ありますし、
何かしらの対処の方法があると思いますので、
がんばって探してみます。
最悪、毎日リブート運用とか、バッチを仕込むのも考えます。
もし、何か方法が見つかりましたら、情報提供くださるとありがたいです。
No.4
- 回答日時:
セッションリスナーをご存知でしょうか?
http://www.ingrid.org/jajakarta/servletapi/servl …
セッション作成時とか消滅時のタイミングで呼ばれます。
sessionDestroyedメソッドは消滅時に呼ばれます(ブラウザを閉じた時等)
インターネットで検索すると幾つかサンプルが出てきますので詳細は
そちらをご覧ください。
ご参考まで。
No.3
- 回答日時:
この例外はDBCPのコネクションプールを受け持つメソッドで発生しています。
コネクションプールはリソースの省資源化、コネクションする際のサーバー負荷軽減などメリットがあります。
また、コネクションプールは通常、最大数が決まっています。
それをオーバーしてしまうとgetConnectionメソッドで、コネクションオブジェクトを返す事ができなくなり、
getConnectionメソッドはコネクションが空くまで(どこかのインスタンスでcloseされるまで)、待ち状態になります。
それが、ずーーーと続いてしまうとタイムアウトで例外発生という仕組みです。(恐らくcontext.xmlファイルのmaxWait設定値を超えたとき)
セッションを作って管理するのが良いと思います。
1つの接続に対し、セッションオブジェクトを生成し、
そのセッションオブジェクト内にコネクションオブジェクトを
置いておく構造にします。そして、そのセッション内に
コネクションオブジェクトがnullならgetConnectionするという
感じです。
若しくは、最初の画面からシステムの機能画面へ遷移する際に
セッションをはり、getConnectionします。
そして、済んだ後、例えば最初の画面へ戻ったとき等に、
コネクションをcloseし、セッションを無効化する。
という事で、ご参考まで。
皆様ご回答ありがとうございます。
初めて投稿するもので、あまりの回答の早さに驚いております。
セッションで管理するのがよさげなのですね。
ちょっとやってみます。
気になるのですが、ブラウザの「×」で閉じた場合、
セッションの破棄は「invalidate()」をされないと思うので、コネクションプールは開いたままになってしまうような気がするのですが。
ケータイでもアクセスできるようなシステムを作りたいと思ってまして、
その場合、JavaScriptのonUnloadでSubmitさせるとかはできないと思うので。
以下の2案のような対処方法があったらいいと思うのですが、なさそうですね。
・バックグラウンドでコネクションプーリングを監視するJavaプログラムとかを常駐させといて、使われてなくて開いているコネクションプーリングがあったら閉じる
・getConnectionは新規にコネクションプールを取得するメソッドですので、getActiveConnectionみたいな、開いていて使われてないコネクションを取得するメソッドがあればいいのですが、APIリファレンスを見る限りなさそうですね。
No.2
- 回答日時:
いやいやいや
ずばりconnectionをcloseしていないのが原因よ。
データベースが接続を許可している数が
例えば50となっている場合、
connectionを50個ゲットしたら
次の51個目はゲットできないわ。
そうなると強制的にDBとのコネクションを切らない限り
次のコネクションを生成することができないのよ。
No.1
- 回答日時:
↑の状況に似てる気がします。
>今回は web アプリケーション側で、SQL を実行する度に
> BasicDataSource クラスを毎回 new していたため、その都度新たな
> JDBC 接続が生成され、プーリングされていた。
>つまり、sleep プロセスがたまる一方で、これが MySQL の max
>connections を超えたとき Nested Exception が発生した、という
>ことのよう。
DBの接続方法の部分のコードやJDBCドライバーは何を使っているのか?
とかがあればもう少し原因がわかるかもしれず。
>【補足】
>すみません。try{}catchのcatch側に、close()を入れてませんでした。
>しかし、close()を入れてないからといってサーバリブート(サービスリブート)しないかぎり、鍵が開けられないような感じになっているのは
>なんか変ですね。
そんなことはないでしょう、世の中1つの問題が複数のインシデントを引き起こしたりするもんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP eclipse pleiades phpのインストールについて 1 2023/02/03 17:15
- サーバー 別サーバに構築したApache+Tomcatの連携について 2 2023/03/06 23:23
- Java Javaで個人ブログサイトを作りたい 7 2022/04/03 17:37
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- SQL Server SQL ServerでDBを構築。これは開発? 4 2022/05/28 14:10
- オープンソース AWSドメイン名でApacheテスト・ページを表示させる方法を教えて下さい。 1 2023/04/26 15:59
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascriptでセッションの削除...
-
setAttribute getAttribute 配...
-
エラーページ遷移後に入力値を残す
-
HTMLのSELECTタグの使い方、JSP...
-
セッション切れでのリクエスト...
-
三菱GOTの画面切り替えについて
-
ボタンが活性化の場合とは、ボ...
-
jspからServletを呼び、元のjsp...
-
フォーム上で押されたボタンに...
-
JSPから出力されたHTML画面のcl...
-
jspのクラスのコンパイルエラー
-
perl cgiのサーバ負荷について
-
Java-jspの画面入力値保持について
-
formでテキストとファイルタイ...
-
コンボボックスの値が画面移動...
-
Firefox,Operaで戻れないページ...
-
strutsで、JSP→アクションクラ...
-
リクエストに応じたselectedの...
-
プルダウン形式でリンク先を選ぶ
-
PDFファイルを表示するサブ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グローバルIPアドレスの変更タ...
-
javascriptでセッションを取得
-
エラーページ遷移後に入力値を残す
-
JSPでsession変数が勝手に書き...
-
MySQL・Tomcat・JSP 何度もSub...
-
JSP + ラジオボタン
-
セッションタイムアウトの設定...
-
リンクをクリックするとセッシ...
-
ASP.NETのGlobal.asaxについて
-
ログイン後の画面をアドレスバ...
-
sessionスコープとapplication...
-
javascriptでのログアウトボタン
-
HTMLのSELECTタグの使い方、JSP...
-
セッションの情報の消去について
-
ASP Session変数名の取得
-
setAttribute getAttribute 配...
-
CGI::Sessionでのユーザとの紐...
-
画面遷移でセッション切れにな...
-
セッションタイムアウト時にエ...
-
セッションについて。
おすすめ情報