- PR -

次の日になるとデータベースに接続できないのは何故?

1
投稿者投稿内容
めがろぱ
常連さん
会議室デビュー日: 2004/05/11
投稿数: 20
投稿日時: 2004-05-13 11:20
過去この会議室でどなたかの同じ様な質問がありましたが、回答がなかったので再度質問
させていただきます。

今年1月からStruts1.1、Tomcat4、MySQL、Eclipseを使ってWebアプリの開発をはじめて、
どうにか作れる様になり実際にサーバー(Win2000)で運用を始めようとしているのですが、
以下の問題が発生しその原因を追求中なので、何かわかるかたいましたら教えてください。

その問題とは、サーバーでTomcatを起動して、他クライアントのマシンから自作のWebア
プリのページをアクセスしてみると、問題なく動作してたのですが、翌日朝一番にそのペー
ジを(サーバーでもクライアントからでも)アクセスすると、

コンソールに
情報: getConnection()
2004/05/11 8:49:29 org.apache.struts.legacy.GenericDataSource getConnection
情報: Check for timeout, activeCount=2, useCount=0
2004/05/11 8:49:29 org.apache.struts.legacy.GenericDataSource getConnection
情報: Found available connection
・・・・・
と表示されていて、データベースに接続できずエラーになります。たぶん、翌朝にか
ぎらず5〜6時間たつとこの現象になるようです。この現象がでたら、それ以降デー
タベースに接続が全くできないのでが、Tomcatを再起動すると、また正常な動作をし
ます。

データベースとの接続の仕方(自分のプログラム)に問題があるのか、設定ファイル
(struts-config.xmlやweb.xml)の書き方に問題があるのかMySQLの設定が問題なのか
もわかりません。また、(データーベースに接続できなくなる)5〜6時間は何の設
定時間なのかよくわからないです。

ちなみに、私が作った別のWebアプリは、このサーバー(Tomcat上)で正常に動作し
ています。(上記問題Webアプリがこの現象になった時にも、正常動作します)

それから、リモートのパソコンからTomcatの再起動ってできるのでしょうか?

わかるかたいましたら、よろしくお願いします。
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2004-05-13 12:19
connectionのcloseをしていないところがあってConnectionPoolからconnectionがなく
なっているのではないでしょうか?
わんこ
常連さん
会議室デビュー日: 2003/04/30
投稿数: 46
投稿日時: 2004-05-13 13:16
connectionのタイムアウトなのではないのでしょうか?
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-05-13 13:18
wait_timeoutというMYSQLのパラメータを確認して見て下さい。
何も指定しないと8時間でアイドル状態の接続は切断されます。
Windowsなら%windir%\my.iniの[mysqld]にwait_timeout=60とか追加して
現象が1分で再現するか確認してみてはどうですか?


[ メッセージ編集済み 編集者: いっきゅう 編集日時 2004-05-13 14:56 ]
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-05-13 16:15
私は MySQL については知らないので Struts の事のみ書きます。

まず、Struts 1.1 では GenericDataSource の使用を推奨していません。
使う人が減り、問題が発生して質問しても、答える人が少なくなるでしょう。

さて、本題。
引用:

めがろぱさんの書き込み (2004-05-13 11:20) より:
情報: getConnection()
2004/05/11 8:49:29 org.apache.struts.legacy.GenericDataSource getConnection
情報: Check for timeout, activeCount=2, useCount=0
2004/05/11 8:49:29 org.apache.struts.legacy.GenericDataSource getConnection
情報: Found available connection
・・・・・
と表示されていて、データベースに接続できずエラーになります。たぶん、翌朝にか



この部分から DB に接続できない原因を知ろうとするのは的外れです。
もっとログは続いているはず。

「データベースに接続できずエラー」とは、具体的には ?
(1) getConnection() で Connection が取得できない。
(2) 取得した Connection を使おうとして使えない。

それから struts-config.xml の data-source 要素を提示した方が良いと思います。
めがろぱ
常連さん
会議室デビュー日: 2004/05/11
投稿数: 20
投稿日時: 2004-05-13 22:29
どうも、皆さん、アドバイスありがとうございます。とても参考になります。

まず、connectionのcloseしていない可能性ですが、実は別のWebアプリで
connectionが例外になったとき時closeしていな場合があって、そのときは、
たぶん、ご指摘のConnectionPoolからconnectionができない現象になって
いました。この場合は今回と違い、コンソールに確か(ログを控えていない
ので正確ではありませんが)closeを待つと言う内容の行が永遠と次から次ぎ
えと繰り返しでてきて、Webアプリ全体が動作しなくなる現象でした。この
Webアプリは、それを注意して書いたので、大丈夫だと思います。(ちょっと不安)

それで、connectionのタイムアウトはどこで設定するのでしょうか?
%windir%?my.iniのwait_timeoutのことですか?

次に、wait_timeout=60にしてみました。予想通り1分でこの現象になりました。
と言う事は、このwait_timeoutを無限大(てどう書くの?)に設定すれば良いの
でしょうか?それとも、私のプログラムが原因?この辺りは私の勉強していた本に
は書いていなかったです。

最後に、「データベースに接続できずエラー」とは、具体的には、

db = objDs.getConnection();
sqlStr = "SELECT * FROM XXXXXX";
objPs = db.prepareStatement(sqlStr);
rs = objPs.executeQuery(); <---------この行でエラーになります。

なので、
「(2) 取得した Connection を使おうとして使えない。 」でしょうか。

struts-config.xml の data-sourceの設定は、
<data-source>
<set-property property="description" value="Artimus:MySQL Data Source Configuration" />
<set-property property="driverClass" value="org.gjt.mm.mysql.Driver" />
<set-property property="url" value="jdbc:mysql://localhost/xxxxxxx?useUnicode=true&amp;characterEncoding=Shift_JIS" />
<set-property property="user" value="xxxxxx" />
<set-property property="password" value="xxxxxx" />
<set-property property="autoCommit" value="true"/>
<set-property property="maxCount" value="4"/>
<set-property property="minCount" value="2"/>
</data-source>

です。これって、GenericDataSourceって使っているのしょうか?この辺りも勉強した
本のサンプルを参考にしています。

よろしく、お願いいたします。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-05-14 10:40
引用:

めがろぱさんの書き込み (2004-05-13 22:29) より:
最後に、「データベースに接続できずエラー」とは、具体的には、

db = objDs.getConnection();
sqlStr = "SELECT * FROM XXXXXX";
objPs = db.prepareStatement(sqlStr);
rs = objPs.executeQuery(); <---------この行でエラーになります。

なので、
「(2) 取得した Connection を使おうとして使えない。 」でしょうか。



これはつまり、GenericDataSource は Connection を返したが、
その Connection がちゃんと使えるものではなかったという事ですよね。
接続プールの仕組みを考えれば、なぜこんな事が起こるのか予想がつくのでは
ないかと思います。

で、対応法を言ってしまえば data-source の set-property 要素で
pingCommand または pingQuery を指定します。

DB との接続は、様々な要因で切断されてしまいます。
これが、実際には接続出来ていない状態の Connection のインスタンスが、
接続プール内に保持されてしまう原因です。

このプロパティを指定すると、GenericDataSource は getConnection() 時に
実際に DB と接続状態にある Connection を返す様になります。


[ メッセージ編集済み 編集者: はしもと 編集日時 2004-05-14 10:42 ]
めがろぱ
常連さん
会議室デビュー日: 2004/05/11
投稿数: 20
投稿日時: 2004-05-14 21:33
はしもとさん、アドバイスありがとうございます。

教えていただいたset-property で指定したら、wait_timeout=60でも一分以上
たっても、正常動作しています。たぶん、ずっと大丈夫の様な気がします。
どうもありがとうございました。

明日の朝の確認が楽しみです。(^^;;
1

スキルアップ/キャリアアップ(JOB@IT)