3

pgx で sqlx を使用しているときに、このエラーが頻繁に発生します。これは、構成エラーであり、把握していないデータベースの概念であると考えています。

error: 'write tcp [redacted-ip]:[redacted-port]->[redacted-ip]:[redacted-port]: write: connection timed out

これは、データベースから読み取ろうとしたときに発生します。起動段階で sqlx を初期化します。

package main

import (
    _ "github.com/jackc/pgx/stdlib"
    "github.com/jmoiron/sqlx"
)

//NewDB attempts to connect to the DB
func NewDB(connectionString string) (*sqlx.DB, error) {
    db, err := sqlx.Connect("pgx", connectionString)

    if err != nil {
        return nil, err
    }

    return db, nil
}

データベースとの対話を担当するすべての構造体は、このポインターにアクセスできます。それらの大部分はSelectまたはGetを使用しており、それらがプールへの戻り接続を単独で使用していることを理解しています。を使用する 2 つの関数がありExec、関数の最後に結果とエラーのみを返します。

その他の注意事項

  • 私のPostgres dbは100をサポートしていますmax_connections
  • このエラーの時点で、いくつかのアクティブな接続のみを表示しました
  • 使用していないSetMaxIdleConnectionsか、SetMaxOpenConnections
  • ページを更新してリクエストを再度トリガーすると、常に機能します

ここで何が起こっているのかについてのヒントはありますか?

編集: このサーバーが compose.io 上にあり、AWS でホストされていることについては触れていません。AWS がこれらの接続をゾンビに変えてしまう可能性はありますか?それらが非常に長い間開いていて、1 つずつ試行に失敗した後にタイムアウトが発生したためですか?

4

1 に答える 1

0

大まかな計算を利用して、これらの接続の最大有効期間を 10 分に設定しました。このコードを上記の質問の init 関数に挿入して、開いている接続とアイドル状態の接続の数を制限し、接続の寿命を 30 秒に制限しました。

db.SetConnMaxLifetime(time.Duration(30) * time.Second)
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(20)

うまくいけば、これは他の誰かに役立ちます。

SELECT * FROM pg_stat_activity;接続を釘付けにするのにも最適です。

于 2016-11-01T15:01:58.183 に答える