次のコラムでは、データベース/SQL を使用する際に避けるべき 11 の落とし穴を紹介します。困っている友人の役に立てば幸いです。
私たちは データベース/SQL を使用する場合は、次の 11 の落とし穴に陥らないようにしてください。 (Goデータベース) 言語とそのデータベース アクセス ライブラリdatabase/sql の大ファンです。おそらく自分の目で見てわかるように、
database/sql のサイズは非常に小さいですが、それを使用して多くのことができます。これには、エラーや欺瞞的なエラーの重大なリスクが含まれます。このブログ投稿では、皆さんが同じ間違いを繰り返さないことを願って、私たちが過去に犯した間違いのいくつかを取り上げます。 一般的な落とし穴
を遅延させると、メモリと接続の使用量が際限なく増加します。
グローバル sql.DB を作成し、API サーバーが応答する必要がある受信 HTTP リクエストごとに新しいものを開かないでください。そうしないと、データベースへの多数の TCP 接続を開いたり閉じたりすることになります。
TIME_WAIT 状態の遅延、負荷、TCP 接続が重くなっています。
rows 変数を閉じるのを忘れると、接続リークが発生します。サーバーの負荷が増加すると、max_connections エラーなどのエラーが発生する可能性があります。
rows.Close() は、後で再度使用する場合でも、できるだけ早く実行してください (これも無害です)。同じ理由で、db.QueryRow()
と .Scan()
をチェーンします。
strconv またはキャストによりコードが乱雑になります。
にバックグラウンドで変換を行わせることをお勧めします。
に接続プーリング、再接続、および再試行ロジックを処理させます。
rows.Next() ループが異常終了する可能性があることを忘れないでください。
結果セットがない場合は、結果セットを反復処理することを データベース/SQL を使用する場合は、次の 11 の落とし穴に陥らないようにしてください。 (Goデータベース) に指示しないでください。そうしないと、接続がリークします。
を実行してから、SELECT * FROM tbl1 を実行すると、ブロックされて待機する可能性が高くなります。単一のステートメントが使用されていることを確認する必要がある場合は、パラメータ sql.Tx
を使用する必要があります。
はトランザクションにバインドされていますが、データベースはバインドされていないため、データベースにアクセスしてもトランザクションには参加しません。
NULL 型を変数にスキャンすることはできません。ただし、それが
database/sql パッケージによって提供される NullXXX
型の 1 つであるか、またはユーザーがそれを作成する必要があります。自分自身、またはドライバーによって提供される)、そうでない場合。スキーマを注意深く確認してください。列が NULL
である可能性がある場合、いつかは NULL
になり、テストで機能したものが運用環境では機能しなくなる可能性があるためです。
以上がデータベース/SQL を使用する場合は、次の 11 の落とし穴に陥らないようにしてください。 (Goデータベース)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。