- - PR -
次の日になるとデータベースに接続できないのは何故?
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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の再起動ってできるのでしょうか? わかるかたいましたら、よろしくお願いします。 | ||||
|
投稿日時: 2004-05-13 12:19
connectionのcloseをしていないところがあってConnectionPoolからconnectionがなく
なっているのではないでしょうか? | ||||
|
投稿日時: 2004-05-13 13:16
connectionのタイムアウトなのではないのでしょうか?
| ||||
|
投稿日時: 2004-05-13 13:18
wait_timeoutというMYSQLのパラメータを確認して見て下さい。
何も指定しないと8時間でアイドル状態の接続は切断されます。 Windowsなら%windir%\my.iniの[mysqld]にwait_timeout=60とか追加して 現象が1分で再現するか確認してみてはどうですか? [ メッセージ編集済み 編集者: いっきゅう 編集日時 2004-05-13 14:56 ] | ||||
|
投稿日時: 2004-05-13 16:15
私は MySQL については知らないので Struts の事のみ書きます。
まず、Struts 1.1 では GenericDataSource の使用を推奨していません。 使う人が減り、問題が発生して質問しても、答える人が少なくなるでしょう。 さて、本題。
この部分から DB に接続できない原因を知ろうとするのは的外れです。 もっとログは続いているはず。 「データベースに接続できずエラー」とは、具体的には ? (1) getConnection() で Connection が取得できない。 (2) 取得した Connection を使おうとして使えない。 それから struts-config.xml の data-source 要素を提示した方が良いと思います。 | ||||
|
投稿日時: 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&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って使っているのしょうか?この辺りも勉強した 本のサンプルを参考にしています。 よろしく、お願いいたします。 | ||||
|
投稿日時: 2004-05-14 10:40
これはつまり、GenericDataSource は Connection を返したが、 その Connection がちゃんと使えるものではなかったという事ですよね。 接続プールの仕組みを考えれば、なぜこんな事が起こるのか予想がつくのでは ないかと思います。 で、対応法を言ってしまえば data-source の set-property 要素で pingCommand または pingQuery を指定します。 DB との接続は、様々な要因で切断されてしまいます。 これが、実際には接続出来ていない状態の Connection のインスタンスが、 接続プール内に保持されてしまう原因です。 このプロパティを指定すると、GenericDataSource は getConnection() 時に 実際に DB と接続状態にある Connection を返す様になります。 [ メッセージ編集済み 編集者: はしもと 編集日時 2004-05-14 10:42 ] | ||||
|
投稿日時: 2004-05-14 21:33
はしもとさん、アドバイスありがとうございます。
教えていただいたset-property で指定したら、wait_timeout=60でも一分以上 たっても、正常動作しています。たぶん、ずっと大丈夫の様な気がします。 どうもありがとうございました。 明日の朝の確認が楽しみです。(^^;; | ||||
1
