- - PR -
Connection reset ?
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-03-15 15:33
初めて投稿させて頂きます。
Apache+Tomcat+postgresql+JavaでWebアプリケーションを作成しているのですが、 それぞれ起動し、ページにアクセスすると、エラー500が表示されます。 それで、Tomcatのログを見ると、以下のエラーが出力されました。 An I/O error occured while reading from backend - Exception: java.net.SocketException: Connection reset Stack Trace: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:168) at java.io.BufferedInputStream.fill(BufferedInputStream.java:183) at java.io.BufferedInputStream.read(BufferedInputStream.java:201) at org.postgresql.PG_Stream.ReceiveChar(PG_Stream.java:138) at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:76) at org.postgresql.jdbc1.AbstractJdbc1Connection.ExecSQL(AbstractJdbc1Connection.java:482) at org.postgresql.jdbc1.AbstractJdbc1Connection.ExecSQL(AbstractJdbc1Connection.java:461) at org.postgresql.jdbc1.AbstractJdbc1Connection.setAutoCommit(AbstractJdbc1Connection.java:957) at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:266) 不思議なのは、2,3回同じページにアクセスすると、正常に表示されるのですが、 次の日(日付が変わると)また同じエラーが表示されます。 また、単体、複数でも同様の現象になります。 また、正常に動作している時に、Apache,Tomcatを再起動すると 正常に動作するのですが、日付が変わるとまた同様にエラーになります。。。 環境は以下の通りです。 Redhat :9 Apache: :Apache1.3.26+mod_ssl tomcat :jakarta-tomcat-4.1.30 JAVA :j2sdk1.4.2_03+JDBC,mod_jk13 postgresql 原因が掴めなくて、困っています。 ご教授願いませんでしょうか。。。 | ||||||||
|
投稿日時: 2004-03-15 16:26
DB の利用に関する設定は ?
PostgreSQL を起動しているホストが、或るタイミングで PostgreSQL のプロセスに何かしてませんか ? | ||||||||
|
投稿日時: 2004-03-15 17:19
回答ありがとうございます。
server.xmlは以下の通りに設定しています。 ちなみに、アプリケーションとDBは別々のサーバにあります。 <Context path="/etc" docBase="etc" debug="1" reloadable="true" crossContext="false"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="特定のIPアドレスを設定"/> <Resource name="jdbc/forEtc" auth="Container" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/forEtc"> <parameter> <name>factory</name> <value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter> <parameter> <name>driverClassName</name> <value>org.postgresql.Driver</value> </parameter> <parameter> <name>url</name> <value>jdbc:postgresql://DBがあるサーバのIPアドレス:5432/etc</value> </parameter> <parameter> <name>username</name> <value>staff</value> </parameter> <parameter> <name>password</name> <value>staff</value> </parameter> <parameter> <name>maxActive</name> <value>20</value> </parameter> <parameter> <name>maxIdle</name> <value>10</value> </parameter> <parameter> <name>maxWait</name> <value>-1</value> </parameter> <parameter> <name>removeAbandoned</name> <value>true</value> </parameter> <parameter> <name>removeAbandonedTimeout</name> <value>120</value> </parameter> <parameter> <name>logAbandoned</name> <value>true</value> </parameter> </ResourceParams> </Context> 現在、DBがあるサーバの中身が簡単に確認できない状況なので、 覚えている限り書きますと、 postgresの起動は、 /usr/local/pgsql/contrib/start-scripts/配下の linux ファイルを以下のように修正し、 起動ディレクトリ配下に置いて実行しています。 # su - $PGUSER -c "$DAEMON restart -D '$PGDATA' -s -m fast" ↓「.bashrc」で設定しているのとかぶるため、「su - 」ハイフンをなくした su $PGUSER -c "$DAEMON restart -D '$PGDATA' -s -m fast" また、postgresql.confでsyslogにログを吐き出す処理を設定しています。 # # Syslog # #syslog = 0 # range 0-2 syslog = 2 # range 0-2 #syslog_facility = 'LOCAL0' #syslog_ident = 'postgres' | ||||||||
|
投稿日時: 2004-03-15 21:23
コネクション・プーリングしてますから、Tomcat と PostgreSQL が
接続された状態に成りますよね。 その状態の時に、PostgreSQL が何らかの理由で接続を切断したのでは ないかと思うのですが。 例えば cron で PostgreSQL のプロセスに 1 日 1 回何かしてるとか。 | ||||||||
|
投稿日時: 2004-03-16 12:16
橋本と申します。(はしもとさんすいません、紛らわしくて・・・)
以前あったのですが、WEBサーバをDMZに、DBサーバをLANに置いたとき、 ファイアウォールのセッションタイムアウトが短く設定されていたため、 夜中はほとんどアクセスが無いときにコネクションが切断されていて 朝になったらエラーが起きたことがありました。 はずしてたらすいません。 | ||||||||
|
投稿日時: 2004-03-17 10:41
はしもとさん、橋本さん、回答ありがとうございます!
postgresqlのログを確認したところ、ログを取るぐらいで特に何も出ていませんでした。 現状DBがあるサーバには触れないので、それ以上確認が取れないのですが・・・。
橋本さんの言われている構成と同じです! ファイアウォールのセッションには全然気づきませんでした。 ちょっと調べてみます。 ちなみに橋本さんの場合、どう解決されたのでしょうか? 参考に教えていただけないでしょうか? | ||||||||
|
投稿日時: 2004-03-17 11:46
実際に私が担当したわけではないのですので詳しくないですが・・・ まずは、10分に一回WebサーバからDBへ接続するシェルを作って 無接続時間が短くなるようにしたと聞きましたね。 で、F/Wのタイムアウト設定を25時間とかに変更して対応したそうです。 (そのシステムは一日一回再起動をしてコネクションを張り直していたので) ただ、F/W側でタイムアウトの時間を長く変更出来なかったらアウトですが。 それ以外で思いつくのは、WEBサーバもLAN側に置いてNATでDMZに出すとか? でもあまりネットワークに詳しくないので、このやり方って一般的なのかどうか・・・ 他の方はどうされてるんでしょうか? [ メッセージ編集済み 編集者: 橋本 編集日時 2004-03-17 11:47 ] | ||||||||
|
投稿日時: 2004-03-17 12:31
私が担当したお客様のところでも似たようなことがありました。
橋本さんと同じような感じでファイアウォールのタイムアウト時間を伸ばして もらおうとしましたが、それが許可できないとのことで、 接続が切れてしまった場合、その後に接続しに行く際に切れていたらつなぎ直す 処理を入れることで対応しました。 | ||||||||
