Maison  >  Article  >  développement back-end  >  Évitez de tomber dans ces 11 pièges lorsque vous utilisez base de données/sql ! (Aller à la base de données)

Évitez de tomber dans ces 11 pièges lorsque vous utilisez base de données/sql ! (Aller à la base de données)

藏色散人
藏色散人avant
2020-10-27 13:50:212238parcourir

Nous sommes de grands fans du langage Évitez de tomber dans ces 11 pièges lorsque vous utilisez base de données/sql ! (Aller à la base de données) et de sa bibliothèque d'accès aux bases de données . Comme vous pouvez probablement le constater de vos propres yeux,

est très petit, mais vous pouvez faire beaucoup de choses avec. Cela inclut des risques substantiels d’erreur et d’erreur trompeuse. Cet article de blog est dédié à certaines des erreurs que nous avons commises dans le passé, dans l’espoir que vous ne referez plus les mêmes erreurs.

Évitez de tomber dans ces 11 pièges lorsque vous utilisez base de données/sql ! (Aller à la base de données)Pièges courants

database/sqldatabase/sql

Retard dans une boucle.

Les fonctions de longue durée ont des requêtes dans la boucle, et retarder

dans la boucle entraînera une croissance sans limite de l'utilisation de la mémoire et de la connexion.
  • Ouvrez de nombreux rows.Close() objets.

    Veuillez créer un
  • global et n'en ouvrez pas un nouveau pour chaque requête HTTP entrante à laquelle votre serveur API doit répondre. Sinon, vous ouvrirez et fermerez de nombreuses connexions TCP à la base de données.
  • Etat de latence, charge et connexions TCP beaucoup.

    dbsql.DBNe faites pas TIME_WAIT une fois l'opération terminée.

    Oublier de fermer la variable rows signifie une fuite de connexion. Combiné à la charge croissante sur le serveur, cela pourrait signifier rencontrer des
  • erreurs ou similaires. Veuillez exécuter
  • dès que possible, même s'il sera réutilisé plus tard (également inoffensif). Liez

    et ensemble pour la même raison. rows.Close()max_connectionsrows.Close()db.QueryRow() Ballonnement de déclaration préparée. .Scan() Si le code s'exécute avec une concurrence élevée, déterminez si les instructions préparées sont la bonne solution, car elles peuvent être re-préparées plusieurs fois sur différentes connexions lorsque la connexion est occupée.

  • strconv ou cast encombrent le code. Il est recommandé d'analyser le résultat dans une variable du type souhaité et de laisser

    faire la conversion pour vous en coulisses.
  • La gestion des erreurs et les nouvelles tentatives conduisent à un code confus. .Scan() Laissez

    gérer la logique de regroupement de connexions, de reconnexion et de nouvelle tentative pour vous.
  • J'ai oublié de vérifier les erreurs après database/sql.

    N'oubliez pas,
  • la boucle peut se sortir anormalement.
  • rows.Next()Utilisez rows.Next() pour les requêtes non-SELECT.

    S'il n'y a pas de jeu de résultats, ne dites pas à Évitez de tomber dans ces 11 pièges lorsque vous utilisez base de données/sql ! (Aller à la base de données) que vous souhaitez parcourir le jeu de résultats, sinon la connexion sera divulguée.
  • db.Query()Supposons que les déclarations suivantes utilisent la même connexion. Si vous exécutez deux instructions successivement, elles s'exécutent probablement sur deux connexions différentes. Exécutez

    , puis
  • et vous bloquerez probablement et attendrez. Si vous devez vous assurer qu'une seule instruction est utilisée, vous devez utiliser le paramètre
  • .

    LOCK TABLES tbl1 WRITESELECT * FROM tbl1Accédez à la base de données tout en utilisant TX. sql.Tx

    est lié à une transaction, mais la base de données n'est pas liée, donc y accéder ne participera pas à la transaction.
  • a été surpris par un sql.Tx.

    Vous ne pouvez pas numériser un type
  • dans une variable à moins qu'il ne s'agisse de l'un des types
  • fournis par le package

    (soit créé par vous, soit fourni par le pilote). Vérifiez bien votre schéma, car si une colonne peut être , un jour elle deviendra NULL, et ce qui fonctionne en test risque de tomber en panne en production. NULLdatabase/sqlNullXXXNULLAdresse originale : https://orangematter.solarwinds.com/2017/03/23/common-pitfalls-when-using-database-sql-in-go/ NULL

    Adresse de traduction : https://learnku.com/go/t/50966

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Introduction aux pointeurs GoArticle suivant:Introduction aux pointeurs Go