はじめに
Go で Postgres 接続を管理する場合、次のことが重要です。接続を効率的に利用して、パフォーマンスのボトルネックや不必要なリソースの消費を回避します。この記事では、sql.DB プールを使用して、単一の Postgres データベース接続を行挿入に効果的に再利用する方法を検討します。
問題: 複数の接続が開かれている
提供されたコードはデータベースへの複数の接続を開き、接続プールを使い果たし、挿入操作が失敗します。これは、db.QueryRow() メソッドがクエリの実行後に接続を適切に解放していないために発生します。
sql.DB について
sql.DB は接続です接続を自動的に管理し、再利用するプール。必要な場合にのみ、データベース サーバーで定義された制限まで新しい接続を作成します。
問題: スキャン コールがありません
コード内では、db.QueryRow( ) は、返された *Row 値に対して Scan メソッドを呼び出さずに使用されます。内部では、*Row は、Scan が呼び出されたときに解放される接続を保持します。 Scan を呼び出さないと、接続は開いたままになり、接続の蓄積とパフォーマンスの問題が発生します。
解決策: *Row を適切に処理する
問題を解決するには、次のいずれかを実行します。クエリ結果が必要ない場合は Exec を使用するか、返された *Row に対して Scan を呼び出して関連付けられたデータを解放します。
更新されたコード
次の更新されたコードは、Scan を使用して接続を正しく解放します。
sqlStatement := ` INSERT INTO heartbeat ("Legend", "Status", "TimeStamp") VALUES (, , ) ` row := db.QueryRow(sqlStatement, Legend, Status, TimeStamp) var result int if err := row.Scan(&result); err != nil { log.Fatal("Error scanning query result:", err) }
または、次の場合は Exec を使用できます。クエリが結果を返しません:
sqlStatement := ` INSERT INTO heartbeat ("Legend", "Status", "TimeStamp") VALUES (, , ) ` if _, err := db.Exec(sqlStatement, Legend, Status, TimeStamp); err != nil { log.Fatal("Error executing query:", err) }
*Row を適切に処理して解放することによって接続を確立すると、データベース接続を効率的に使用できるようになり、パフォーマンスと信頼性が向上します。
以上がGo で行挿入のために Postgres 接続を効率的に再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。