JSP、PostgreSQLでシステムを構築しています。
JSPでPostgreSQLに接続し、更新や参照などはまったく問題ありません。
データベースに接続したら、接続した内容をインスタンス化し、Sessionレベルで情報を保つようにしています。
ページが変更しても再接続する必要がないためです。
問題は、ブラウザを閉じたときに接続が残ってしまう状況です。
PostgreSQLで、pg_stat_activityを参照すると、ブラウザが閉じても残っているのです。
同時接続数は32(デフォルト)の状態なので、何度か起動されるとすぐに「Too many client」エラーが出てしまいます。
どうにか打開策はないでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
コネクションプーリングは使用していますか?
普通はServlet(JSP)から直接RDBMSにJDBC接続するような
使い方はしません。
(それは教科書での話であって、実用的ではありません。)
コネクションプーリングを利用すればいいと思います。
参考URLは知らないので書きませんが検索エンジンを使って検索してみてください。
参考書籍は挙げておきます。
「コア・サーブレット&JSP」
ためになると思います。
> コネクションプーリングは使用していますか?
この方法は使用していませんでした。
教科書どおりの方法を使っていました。(^^;
検索でいろいろと出てきましたので、参考にして改良しました。
ありがとうございました。
No.3
- 回答日時:
> そのオブジェクトがブラウザが閉じて後も生きてるのでしょうか?(そんなことはないと思いますが・・・)
HTTPセッションのオブジェクトは、サーバ側に作られます。
クライアントのブラウザに対しては、このサーバ側のセッションオブジェクトに
アクセスするためのIDのみが保存されます。
このため、クライアントでブラウザを閉じても、セッションオブジェクト自体は
削除されません。
また、セッションはクライアントのブラウザのプロセスごとに作られるので
今の場合、クライアントが複数のブラウザを起動すると、やはりデータベース
へのコネクションが減っていくはずです。。。
# IEとかで、「新しいブラウザで開く」とかを使うと、同じプロセスで
# 動くので、セッションは1つしか作られないんですが・・・
> 問題はブラウザを閉じても接続が残ることです。
今は、どのタイミングでデータベースへのコネクションを切断しているんでしょう?
質問を見ると、コネクションはオープンされたままずっと残っているようです。
このままだとセッションが残るとか、ブラウザを閉じられるせいとかいう以前に、32以上の
ブラウザからアクセスがあった段階でアウトですね。。。
対策としては、最初に示したとおり、JSP内で必ずコネクションの切断を
行うようにするか、No.2 でもご指摘されている通り、コネクションプーリングを
実装したAPサーバ(or Servlet Engine)を使う/自前で実装する
のいずれかです。
コネクションプールについては、参考URLで簡単に説明がされていますので、
参考にしてみてください
参考URL:http://homepage3.nifty.com/uzblend/servlet/index …
> このままだとセッションが残るとか、ブラウザを閉じられるせいとかいう以前に、32以上の
> ブラウザからアクセスがあった段階でアウトですね。。。
確かにそうですね。
コネクションプーリングで対応しました。
ありがとうございました。
No.1
- 回答日時:
> 接続した内容をインスタンス化し、Sessionレベルで情報を保つようにしています。
> ページが変更しても再接続する必要がないためです。
この処理がよく分からないのですが、これはオープンしたデータベースの
オブジェクト自身をセッションに格納しているのでしょうか?
それとも、単純にデータベースで取得した内容をセッションに保持しているだけ
なんでしょうか?
単純にデータベースの内容をセッションに格納しているだけであれば、
例えばJSPのコード全体をtry節で囲み、finally節でデータベースをクローズ
してやれば、正しく接続を切断できると思います。
<%
try {
// データベースのオープン
// データベースからデータを取り出す等の処理
%>
<html>
HTMLとして表示する部分
</html>
<%
} finally {
// データベースのクローズ
}
%>
セッションにデータベースのオブジェクト自体を入れているような場合には、
少なくともセッションオブジェクトが生きている間はずっとデータベースの
接続が残ったままになりますから、セッションタイムアウトまでの時間を
短くして、セッションが破棄されるときにデータベースをクローズするような
コードを記述するか、データベースプーリングを使って、プール数を32以下に
することで打開できると思うんですが。。。
# ただし、セッション破棄のタイミングをどうやって認識するのか
# 分かりませんが。
この回答への補足
> セッションにデータベースのオブジェクト自体を入れているような場合には、
この方法になります。
> 少なくともセッションオブジェクトが生きている間はずっとデータベースの
> 接続が残ったままになりますから、セッションタイムアウトまでの時間を
そのオブジェクトがブラウザが閉じて後も生きてるのでしょうか?(そんなことはないと思いますが・・・)
問題はブラウザを閉じても接続が残ることです。
> 短くして、セッションが破棄されるときにデータベースをクローズするような
> コードを記述するか、
この方法を考えたのですが、JavaにはC++のようなデストラクタがないですよね。
ファイナライザはあるけど、ガーベッジコレクタと同期してるから必ず動くとは限らないようです。
> データベースプーリングを使って、プール数を32以下に
> することで打開できると思うんですが。。。
この方法はPostgreSQLでの手法なのでしょうか?
何か情報があれば教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL PostgreSQLドライバの登録。 MavenプロジェクトからPostgreSQLへ接続をするため 1 2022/09/26 12:30
- その他(インターネット接続・インフラ) 有線LANでGoogleサイトのみ接続できません 2 2022/06/10 09:14
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- docomo(ドコモ) ワンセグフルセグがとても高機能&多機能なおすすめ機種を教えてください。一番バランス的に優れているワン 2 2023/01/14 18:18
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- タブレット タブレットのWiFi接続が途切れる原因は何ですか? スマホやパソコンは問題ないのにタブレットだけいつ 4 2022/08/04 20:35
- その他(ブラウザ) Win11でブラウザでのネットブラウズができなくなった 4 2022/12/05 18:03
- Outlook(アウトルック) OCN WEBメールについて 1 2022/05/18 23:33
- ドメイン・サーバー・クラウドサービス FileZillaを使用してwpXサーバーに接続できない 2 2022/03/29 21:02
- Windows 10 Windows10起動しない、エラー0xc0000185修復方法 2 2022/07/14 12:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.net(ASP.net)でアクセスカ...
-
セッションに格納する方法
-
リッチクライアントのセッション
-
setAttribute getAttribute 配...
-
グローバルIPアドレスの変更タ...
-
プログラミングで例えばゲーム...
-
腕時計の時報をならないように...
-
C言語で今まで表示していた画面...
-
画面を隠す・消す方法を教えて...
-
jspからjarを参照したいのですが
-
VBAでTIFF画像を読み込むには?
-
javaでクイズ(一問一答)作成...
-
VB.NET DataReaderが開かれている
-
URLはそのままで、リンクをクリ...
-
三菱GOTの画面切り替えについて
-
画面遷移を行わずに同一ページ...
-
このadidasの腕時計の時刻の設...
-
ボタンでパラメータを渡すには
-
3層クライアントサーバとMVCの関係
-
フォーム上で押されたボタンに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javascriptでセッションを取得
-
グローバルIPアドレスの変更タ...
-
javascriptでセッションの削除...
-
エラーページ遷移後に入力値を残す
-
JSPでsession変数が勝手に書き...
-
ASP Session変数名の取得
-
sessionスコープとapplication...
-
画面遷移でセッション切れにな...
-
ASP.NETのGlobal.asaxについて
-
セッションタイムアウト時にエ...
-
Tomcatでの同一セッション同時...
-
javascriptでのログアウトボタン
-
jsessionidの有効期限を延長す...
-
セッションタイムアウトの設定...
-
setAttribute getAttribute 配...
-
セッションIDの桁数
-
JSPでブラウザ終了時にPostgreS...
-
JSP + ラジオボタン
-
HttpSessionListenerクラスに関...
-
複数Webサーバーでのセッション...
おすすめ情報