2011-07-10 16 views
1

私はTomcatの下にJavaアプリケーションを持っており、PostgreとMySQLデータベースに接続しています。 初めてJavaからデータベースにアクセスするたびに、常に失敗します。私はTomcatのログをチェックし、これを見つけました:初回アクセス時のJDBC例外

最終的にサーバーに送信されたパケットは85,313,128ミリ秒前です。サーバが設定した 'wait_timeout'の値よりも長い場合は
です。 アプリケーションの使用前に接続の有効期限が切れているかどうかを検討してください。 クライアントタイムアウトの設定値を増やすか、コネクタ/ J接続 プロパティ 'autoReconnect = true'を使用してこの問題を回避してください。

私はthis question をチェックしましたが、本当に解決策を理解していない(または、それは私の場合に適用される場合)、または、なぜこれが起こっています。

Postgre/MySQLデータベースがあまりにも長くアイドルだったのが問題だと思いますが、Javaでデータベースにアクセスすると接続が開き、終了すると常に閉じます。なぜ接続が残っているのかわかりません長い間開いている。

誰にもアイデアはありますか?

UPDATE:

私はC3POを使用していない...私はとの接続:

Datasource d = context.lookup("...."); 
Connection c = d.getConnection(); 

とを切り離す:

c.close(); 

とMySQLのためのコンテキストは次のようになります。

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="200" maxIdle="15" maxWait="-1" name="jdbc/project" password="...." type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/project" username="..."/> 
<ResourceLink global="jdbc/project" name="jdbc/project" type="javax.sql.DataSource"/> 
+0

どのように接続しますか?自分で接続を管理していますか、接続プールで処理していますか?後者の場合、接続管理を自分の手で行うとどうなりますか? – cdegroot

+0

エラーメッセージのautoReconnect = trueヒントについて調査しましたか?あなたはC3P0のようなSQLプールを使いますか? –

+0

@cdegroot @ZeroPage私の更新を見てください。 –

答えて

2

私は接続プールを使用してMySQLに接続していると推測しています。接続プールの原則は、接続の束を開き、あなたが求めるときにそれらの1つを与えます。接続を閉じると、物理接続は閉じられませんが、接続は別の要求によって使用されるためにプールに戻ります。これにより、接続を無期限に開いたり閉じたりすることがなくなるため、パフォーマンスが大幅に向上します。接続を開くにはコストがかかります。

問題は、接続に過度の時間がかからずにプールに接続されていることです.MySQLはそれがもう開いてもらえないと考えてクローズします。 はこれを避けるために、あなたは

  • あなたにそれを与える前に、接続をテストしたり、エラーメッセージ
  • または接続を使用して示されるように、MySQLサーバ上でWAIT_TIMEOUTを高めるために、あなたの接続プールを構成することができますプロパティautoReconnect = true(エラーメッセージに示されています)。
+0

ありがとうございました。 wait_timeoutを増やすことはオプションではありません - 私はどれくらい前もって分かりません。私はautoReconnectの使用がMySQLによって推奨されていないことを読んだ。だから私は最良の選択肢は、それを使用する前に接続をテストすることだと思います。私はそれをどのようにすることができるか知っていますか? context.xmlには? –

+0

http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing –

+0

mmmmmを参照してください。しかし、私はC3P0を使用しているとは思わないが、他の方法はありますか? –

関連する問題