소개
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!