データベース/SQL を使用する場合は、次の 11 の落とし穴に陥らないようにしてください。 (Goデータベース)

藏色散人
リリース: 2020-10-27 13:50:21
転載
2271 人が閲覧しました

次のコラムでは、データベース/SQL を使用する際に避けるべき 11 の落とし穴を紹介します。困っている友人の役に立てば幸いです。

私たちは データベース/SQL を使用する場合は、次の 11 の落とし穴に陥らないようにしてください。 (Goデータベース) 言語とそのデータベース アクセス ライブラリ

database/sqlデータベース/SQL を使用する場合は、次の 11 の落とし穴に陥らないようにしてください。 (Goデータベース) の大ファンです。おそらく自分の目で見てわかるように、

database/sql

のサイズは非常に小さいですが、それを使用して多くのことができます。これには、エラーや欺瞞的なエラーの重大なリスクが含まれます。このブログ投稿では、皆さんが同じ間違いを繰り返さないことを願って、私たちが過去に犯した間違いのいくつかを取り上げます。 一般的な落とし穴

ループ内の遅延。
    存続期間の長い関数にはループ内にクエリがあり、ループ内で
  • rows.Close()

    を遅延させると、メモリと接続の使用量が際限なく増加します。

    多くの
  • db
  • オブジェクトを開きます。

    グローバル sql.DB を作成し、API サーバーが応答する必要がある受信 HTTP リクエストごとに新しいものを開かないでください。そうしないと、データベースへの多数の TCP 接続を開いたり閉じたりすることになります。 TIME_WAIT 状態の遅延、負荷、TCP 接続が重くなっています。

    操作の完了後に
  • rows.Close()
  • を実行しないでください。

    rows 変数を閉じるのを忘れると、接続リークが発生します。サーバーの負荷が増加すると、max_connections エラーなどのエラーが発生する可能性があります。 rows.Close() は、後で再度使用する場合でも、できるだけ早く実行してください (これも無害です)。同じ理由で、db.QueryRow().Scan() をチェーンします。

    準備されたステートメントの肥大化。
  • コードが高い同時実行性で実行されている場合は、プリペアド ステートメントが適切なソリューションであるかどうかを検討してください。これは、接続がビジー状態のときに、プリペアド ステートメントが異なる接続で複数回再準備される可能性があるためです。
  • strconv またはキャストによりコードが乱雑になります。
  • 結果をスキャンして必要な型の変数に変換し、
  • .Scan()

    にバックグラウンドで変換を行わせることをお勧めします。

    エラー処理と再試行は、コードを混乱させる原因になります。
  • database/sql

    に接続プーリング、再接続、および再試行ロジックを処理させます。

  • rows.Next()
  • の後のエラーをチェックするのを忘れていました。

    rows.Next() ループが異常終了する可能性があることを忘れないでください。

    非 SELECT クエリには
  • db.Query()
  • を使用します。

    結果セットがない場合は、結果セットを反復処理することを データベース/SQL を使用する場合は、次の 11 の落とし穴に陥らないようにしてください。 (Goデータベース) に指示しないでください。そうしないと、接続がリークします。

    後続のステートメントは同じ接続を使用すると仮定します。
  • 2 つのステートメントが連続して実行される場合、それらは 2 つの異なる接続で実行される可能性があります。
  • LOCK TABLES tbl1 WRITE

    を実行してから、SELECT * FROM tbl1 を実行すると、ブロックされて待機する可能性が高くなります。単一のステートメントが使用されていることを確認する必要がある場合は、パラメータ sql.Tx を使用する必要があります。

    TX を使用しながらデータベースにアクセスします。
  • sql.Tx

    はトランザクションにバインドされていますが、データベースはバインドされていないため、データベースにアクセスしてもトランザクションには参加しません。

  • NULL
  • には驚きました。

    NULL 型を変数にスキャンすることはできません。ただし、それが database/sql パッケージによって提供される NullXXX 型の 1 つであるか、またはユーザーがそれを作成する必要があります。自分自身、またはドライバーによって提供される)、そうでない場合。スキーマを注意深く確認してください。列が NULL である可能性がある場合、いつかは NULL になり、テストで機能したものが運用環境では機能しなくなる可能性があるためです。

    元のアドレス: https://orangematter.solarwinds.com/2017/03/23/common-pitfalls-when-using-database-sql-in-go/
翻訳アドレス: https://learnku.com/go/t/50966

以上がデータベース/SQL を使用する場合は、次の 11 の落とし穴に陥らないようにしてください。 (Goデータベース)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート