1. ホーム
  2. django

[解決済み] クライアントからデータを受信できませんでした」のデバッグ方法。接続が相手によってリセットされました"

2022-02-17 08:42:18

質問

Ubuntu-12.04でdjango-celeryのアプリケーションを動かしています。

Webインターフェースからceleryタスクを実行すると、postgresql-9.3のログファイル(最大ログレベル)から取得した以下のエラーが表示されます。

2013-11-12 13:57:01 GMT tss_usr 8113 LOG:  could not receive data from client: Connection reset by peer

tss_usr は django アプリケーションデータベースの postgresql ユーザーで、(この例では) 8113 は接続を強制終了したプロセスの pid だと思います。

なぜこのようなことが起こるのか、少なくともこの問題をデバッグする方法について何かご存知ですか?

再び動作させるためには、postgresqlを再起動する必要がありますが、これは非常に不快なことです。

どのように解決するのですか?

これは古い投稿ですが、今日、私のpostgresのログに同じエラーがあったので、私はちょうどそれを見つけました。 私はそれをPDOのselect文に絞り込みました。 私はUbuntu PreciseでZend Framework 1.10.3を使っています。

以下のpdo文は、$opinionが長いテキスト文字列である場合にエラーを発生させました。 私のpostgresテーブルのopinionカラムはText型です。 クエリーは、$opinionが特定の文字数以下であれば成功します。 1000文字なら問題なく動作します。2000文字の場合は、"could not receive data from client.で失敗します。接続が相手によってリセットされました" と表示されます。

  $select = $this->db->select()
           ->from( 'datauserstopics' )
           ->where("opinion = ?",trim($opinion))
           ->where("datatopicsid = ?",trim($tid))
           ->where("datausersid= ?",$datausersid);

  $stmt = $this->db->query($select);

を使って回避しました。 ->where("substr(opinion,1,100) = ?",trim(substr($opinion,1,100)))を使用すると、この問題を回避することができます。

これは完璧な解決策ではありませんが、私の目的にはsubstr()を使用したselect文で十分です。

なお、同じテーブル/カラムに長い文字列を挿入することは問題ありません。 切断の問題は、PDO で比較的長い文字列を選択したときにのみ発生します。