![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
Javaのシステムを運用しています。
1台のサーバー(CentOS5.0)に、Apache-Tomcat5.0-PostgreSQL8.1-アプリケーション(顧客ごと(10社))がインストールされています。
アプリケーションの切り分けはTomcatのconf/catalina/localhost/コンテキスト.xml で定義しています。(コンテキスト1~10を作成)
昨年秋から以下の障害が発生していますが、未だに原因がわからない状況です。
Javaの知識、Tomcatの知識、PostgreSQLの知識など乏しく、ログも取れていない状況です。
どうか、疑わしい原因、調査方法など教えていただきたく存じます。
障害状況
日付 現象 回復
11/6 A画面でB画面への遷移ボタンをした時に Tomcat再起動し、再実行したところ
サーバーのB画面作成処理が中断 正常に処理できた。
11/16 TOPメニューからC画面を選択したが、 約10時間後、中断していたC画面処理
サーバーのC画面作成処理が中断 が再開された。その後正常に処理。
12/26 D画面でE画面への遷移ボタンをした時に Tomcat再起動し、再実行したところ
サーバーのE画面作成処理が中断 正常に処理できた。
1/6 F画面でG画面への遷移ボタンをした時に Tomcat再起動し、再実行したところ
サーバーのG画面作成処理が中断 正常に処理できた。
1/8 F画面でH画面への遷移ボタンをした時に 約45分後、中断していたH画面処理
サーバーのH画面作成処理が中断 が再開された。その後正常に処理。
・他のユーザーがその顧客のシステムを
使うと、E画面処理、G画面処理、H画面
処理で中断する。
・他の顧客のシステムは、同じ処理を行
っても正常に処理できる。(レスポンス
も正常)
中断した処理では、データベースのアクセスは読込み(SELECT文)のみです。
プログラムではThreadクラスは使っていません。
Tomcatの設定でセッションタイムアウト時間を無制限(-1)に設定していました。
Tomcatの設定でコネクションプールの最大値は100に設定しています。
障害発生時は、ログインユーザーは一人だけでした。
その後、GCログの出力、ヒープメモリ使用状況のログ出力、PostgreSqlのログ出力の設定を行いました。
また、セッションタイムアウト時間を30分に設定しました。
本日(1/29)まで障害は発生しておりません。
よろしくご教授ください。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
単純な発想として、コネクションの閉じ忘れとかは無いですか?
コネクションの管理を、自前でやっているのか、フレームワークを利用しているのかで違ってくると思いますので、もしかしたら関係ないかもしれませんが…。
(私も、開発中に時々やってしまいます。まったく反応がなくなり、なんでだ?となり、調べてみると閉じ忘れていた。)
障害発生時のコネクション数を確認してみてはどうでしょうか?
あるいは、障害が発生していなくても、コネクション数が予想より多くないかとか。
ただ、起動時にいきなり最大数を確保してしまうようになっていると、見分けがつかないかもしれません。
コネクションを閉じ忘れていても、Tomcatを再起動すれば、コネクションが一旦解放されます。(同時に、ロックも解放されると思います。)
ご回答ありがとうございます。
私も最初にコネクションのClose漏れを疑いました。
テスト環境にて、コネクションプールを1個ににてテストしましたが、Close漏れはありませんでした。
以前、Close漏れがあったときは、
SQLNestedException: Cannot get a connection, pool exhausted
が発生しエラーログが出ました。
今回はエラーログは何も出ません。
PostgreSQLからの応答をずっと待っているように見えます。
よろしくお願いします。
No.2
- 回答日時:
同時にPostgreSQL8.1を使ったユーザーは居ない、ということで予想は外れてます。
もしも使ったユーザーがいれば、ツールの使用等によりロック処理をしていれば、
10時間後にロック解除することで11/16日のように処理が進むかなと予想しました。
システムが発行するクエリにロックを掛けるようなものはないのでしょうか?
この回答への補足
ご回答をいただきましてありがとうございます。
現象から見ると、DBの特定のテーブルにロックがかかっていて、ロックが解除されるまで待っているように見えます。
調べましたところ、PostgreSQLはSELECT文でもロックがかかるそうです。
現象が発生した処理では、SELECT文だけです。しかも、データ量も少なく、1秒もかからない処理です。
利用ユーザーは1人でデッドロックがかかることは考えにくいのです。
他に、ロックが解除されない状況というものが発生することがあるのでしょうか。
よろしくご教授ください。
teketonさん、ご回答ありがとうございます。
システムが発行するクエリにロックを掛けるようなものはありません。
システム以外では、毎夜、1:02から、バックアップ取得、バキューム、リインデックス処理を行っていますが、同じ時刻には障害は発生していません。
PostgreSQLはSELECT文だけでもロックがかかるという記事を見つけました。
http://d.hatena.ne.jp/chiheisen/20100310/1268238 …
この現象の原因になりうるでしょうか。
また、ロックが原因と仮定したとき、Tomcatの再起動でロックが解除されるものでしょうか。
お考えをお聞かせください。
よろしくお願いします。
No.1
- 回答日時:
DBにロックがかかったのでは?
該当時間帯にDBを使用していたユーザはTomcatからのみでしょうか。
DBを直接参照していたり、バッチが動いていたりとか。
この回答への補足
ご回答ありがとうございます。
障害発生時の状況は、DBのロックがかった状態と思えますが、
Tomcatを再起動することでロックが解除できるのでしょうか。
また、放置した状態で、10時間後、ロックが解除されることがあるのでしょうか。
teketonさんのお考えをお聞かせください。
よろしくお願いします。
ご回答ありがとうございます。
該当時間帯にDBを使用していたユーザーは、Tomcatからのみです。
バッチ処理は行っていません。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Javaプログラミングの質問になります。 ボタンを押下した時に画面遷移して 画面から戻ってきた時のi 1 2023/06/26 07:50
- 電子マネー・電子決済 QUICPayの登録ができない。 4 2023/06/10 10:57
- Excel(エクセル) エクセルVBA マクロ処理中のポップアップメッセージについて 1 2023/08/04 21:34
- MySQL 「掲示板のログイン画面」はPHP~MySQLに「データベース認証のシステム」方式です。 1 2022/09/27 05:00
- PHP 「ログイン機能を持たせる」説明が気難しいです。 2 2022/10/11 02:59
- Windows 10 ウィンドウズ10で起動画面が真っ暗、修復方法は? 6 2022/03/27 19:28
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- PHP 掲示板のセキュリティについてアドバイスお願い致します 1 2023/08/11 20:44
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- デジタルカメラ ニコンD700 内蔵液晶モニター&外部モニターブラックアウト 3 2023/04/25 10:29
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java-jspの画面入力値保持について
-
ServletからServletへの値渡し
-
C# ログイン画面からメイン画面...
-
三菱GOTの画面切り替えについて
-
画像の縦横比固定の計算方法。
-
JAVAで麻雀ゲームの画面を作りたい
-
MFCプログラミング
-
登録後、呼び出し元ページに戻...
-
javaのstrutsを使った画面遷移...
-
ブラウザアドレスバーからのURL...
-
検索画面→結果画面→検索画面と...
-
system("cls")について
-
Javascriptのhistory.back()が...
-
ASP.NET 画面遷移前の状態を保...
-
継承したFormでKeyDownイベント...
-
ブラウザ画面で、変更した値が...
-
非アクティブな画面を操作する...
-
strutsで、JSP→アクションクラ...
-
Strutsの情報保持の仕方について
-
フレームのあるWeb画面から、フ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java-jspの画面入力値保持について
-
三菱GOTの画面切り替えについて
-
C言語で今まで表示していた画面...
-
ServletからServletへの値渡し
-
プログラミングで例えばゲーム...
-
C# ログイン画面からメイン画面...
-
遷移元を判定したい!
-
ASP.NET 画面遷移前の状態を保...
-
画面を隠す・消す方法を教えて...
-
ブラウザアドレスバーからのURL...
-
FormのsubmitでFormの内容がnull
-
ServletからHTMLページへの遷移...
-
Javaプログラミングの質問にな...
-
画像の縦横比固定の計算方法。
-
JAVAのセッション変数の上書き...
-
登録後、呼び出し元ページに戻...
-
Wi-Fiのパスワードが指定なしと...
-
system("cls")について
-
Beautiful Soupのインストール...
-
アドレスバーに引数を表示させ...
おすすめ情報