Hibernation: hbm2ddl.auto=mise à jour en production?

est-il acceptable d'exécuter des applications D'hibernation configurées avec hbm2ddl.auto=update pour mettre à jour le schéma de la base de données dans un environnement de production?

291
demandé sur cherouvim 2008-10-21 14:17:03

15 réponses

Non, c'est dangereux.

malgré les meilleurs efforts de L'équipe D'hibernation, vous ne pouvez tout simplement pas compter sur les mises à jour automatiques en production . Écrivez vos propres correctifs, les passer en revue avec DBA, les Tester, puis les appliquer manuellement.

théoriquement, si hbm2ddl update fonctionnait dans le développement, il devrait fonctionner dans la production aussi. Mais en réalité, il n'est pas toujours le cas.

même si elle ça a bien marché, c'est peut-être sous-optimal. Les AD sont payés autant pour une raison.

346
répondu Vladimir Dyuzhev 2016-12-15 15:12:46

nous le faisons en production, mais avec une application qui n'est pas critique à la mission et sans DBA hautement payés sur le personnel. C'est juste un processus manuel de moins qui est sujet à l'erreur humaine - l'application peut détecter la différence et faire la bonne chose, plus vous avez probablement testé dans divers environnements de développement et de test.

une mise en garde - dans un environnement regroupé, vous pouvez vouloir l'éviter parce que de multiples applications peuvent apparaître en même temps et essayer de modifier le schéma qui pourrait être mauvais. Ou mettez dans un mécanisme où une seule instance est autorisée à mettre à jour le schéma.

67
répondu Brian Deterling 2008-10-21 11:52:38

Hibernate créateurs décourager de le faire dans un environnement de production dans leur livre "Java Persistance avec Hibernate" :

AVERTISSEMENT: Nous avons vu des utilisateurs Hibernés essayer D'utiliser SchemaUpdate pour mettre à jour le schéma d'une base de données de production automatiquement. Cela peut rapidement finir en désastre et ne sera pas autorisé par votre DBA.

46
répondu Roman 2017-01-13 14:32:12

consultez LiquiBase XML pour conserver un journal des mises à jour. Je ne l'avais jamais utilisé jusqu'à cette année, mais j'ai trouvé qu'il est très facile d'apprendre et de rendre le contrôle de révision de DB/migration/Gestion du changement très infaillible. Je travaille sur un projet Groovy / Grails, et Grails utilise hibernation dessous pour tout son ORM (appelé "GORM"). Nous utilisons Liquibase pour gérer toutes les modifications de SQL schema, ce que nous faisons assez souvent au fur et à mesure que notre application évolue avec de nouvelles fonctionnalités.

en gros, vous gardez un Fichier XML des ensembles de modifications que vous continuez d'ajouter à mesure que votre application évolue. Ce fichier est conservé dans git (ou ce que vous utilisez), avec le reste de votre projet. Lorsque votre application est déployée, Liquibase vérifie sa table changelog dans la base de données vers laquelle vous vous connectez afin qu'elle sache ce qui a déjà été appliqué, puis elle applique intelligemment juste ce que les changesets n'ont pas encore été appliqués à partir du fichier. Il fonctionne absolument grand dans la pratique, et si vous l'utilisez pour tous vos changements de schéma, puis vous pouvez être sûr à 100% que le code que vous checkout et déployer sera toujours en mesure de se connecter à un schéma de base de données entièrement compatible.

ce qui est génial, c'est que je peux prendre une base de données totalement vierge sur mon ordinateur portable, démarrer l'application, et tout de suite le schéma est mis en place pour moi. Il rend également facile de tester les changements de schéma en appliquant ces derniers à un local-dev ou une mise en scène db en premier.

la façon la plus facile de commencer avec elle serait probablement de prendre votre base de données existante et ensuite utiliser Liquibase pour générer une ligne de base initiale.fichier xml. Puis dans le futur, vous pouvez simplement ajouter et laisser liquibase reprendre la gestion des modifications de schéma.

http://www.liquibase.org/

28
répondu jpswain 2011-08-13 19:49:30

je voterais non. Hibernate ne semble pas comprendre quand les types de données pour les colonnes ont changé. Exemples (utilisant MySQL):

String with @Column(length=50)  ==> varchar(50)
changed to
String with @Column(length=100) ==> still varchar(50), not changed to varchar(100)

@Temporal(TemporalType.TIMESTAMP,TIME,DATE) will not update the DB columns if changed

il y a probablement d'autres exemples aussi bien, comme pousser la longueur d'une colonne de corde vers le haut plus de 255 et le voir convertir en texte, medium text, etc.

accordé, Je ne pense pas qu'il y ait vraiment un moyen de "convertir les types de données" avec sans créer une nouvelle colonne, la copie des données et soufflant loin le ancienne colonne. Mais à la minute où votre base de données a des colonnes qui ne reflètent pas la cartographie actuelle D'hibernation que vous vivez très dangereusement...

de la voie de migration est une bonne option pour traiter ce problème:

http://flywaydb.org

23
répondu cliff.meyers 2012-11-29 08:34:51

Hibernate doit mettre la clause de non-responsabilité sur le fait de ne pas utiliser les mises à jour automatiques dans prod pour se couvrir quand les gens qui ne savent pas ce qu'ils font l'utilisent dans des situations où il ne devrait pas être utilisé.

a accordé les situations où il ne devrait pas être utilisé beaucoup plus que ceux où il est OK.

Je l'ai utilisé pendant des années sur de nombreux projets différents et n'ai jamais eu un seul problème. Ce n'est pas une réponse boiteuse, et ce n'est pas un cow-boy codant. C'est un fait historique.

une personne qui dit" Ne jamais le faire dans la production " pense à un ensemble spécifique de déploiements de production, à savoir ceux qu'elle connaît (son entreprise, son industrie, etc.).

l'univers des" déploiements de production " est vaste et varié.

un développeur hiberné expérimenté sait exactement ce que DDL va résulter d'une configuration de cartographie donnée. Aussi longtemps que vous tester et valider ce que vous attendre de se retrouver dans le DDL (en dev, qa, la mise en scène, etc), vous êtes beaux.

lorsque vous ajoutez beaucoup de fonctionnalités, les mises à jour de schéma automatique peuvent être un épargnant en temps réel.

la liste des choses que les mises à jour automatiques ne traiteront pas est interminable, mais certains exemples sont la migration de données, l'ajout de colonnes non-nullables, les changements de nom de colonne, etc, etc.

vous devez également prendre soin dans les environnements groupés.

mais encore une fois, si vous saviez toutes ces choses, tu ne poserais pas cette question. Hum. . . OK, si vous posez cette question, vous devriez attendre d'avoir beaucoup d'expérience avec les mises à jour des schémas D'hibernation et d'auto Avant de penser à l'utiliser dans prod.

21
répondu john.stein 2015-09-14 15:55:03

comme j'ai expliqué dans cet article , ce n'est pas une bonne idée d'utiliser hbm2ddl.auto dans la production.

la seule façon de gérer le schéma de la base de données est d'utiliser des scripts de migration incrémentale parce que:

  • les scripts résideront en VCS le long de votre base de code. Quand vous vérifiez une branche, vous recréez le schéma entier à partir de zéro.
  • les scripts incrémentiels peuvent être testés sur un serveur QA avant d'être appliqué à la production
  • il n'y a pas besoin d'intervention manuelle puisque les scripts peuvent être exécutés par Flyway , ce qui réduit la possibilité d'erreur humaine associée à l'exécution manuelle des scripts.

même le Guide de L'utilisateur D'hibernation vous conseille d'éviter d'utiliser l'outil hbm2ddl pour les environnements de production.

enter image description here

8
répondu Vlad Mihalcea 2017-06-05 05:33:56

Nous le faisons dans un projet en production depuis des mois maintenant et n'a jamais eu de problème jusqu'à maintenant. Gardez à l'esprit les 2 ingrédients nécessaires pour cette recette:

  1. Concevez votre modèle d'objet avec une approche de rétrocompatibilité, c'est-à-dire déprécier objets et attributs plutôt que de les supprimer/modifier. Cela signifie que si vous avez besoin de changer le nom d'un objet ou d'un attribut, laisser l'ancien est, l'ajout de la nouvelle et d'écrire une sorte de script de migration. Si vous avez besoin de changer une association entre des objets, si vous êtes déjà en production, cela signifie que votre conception était erronée en premier lieu, alors essayez de penser à une nouvelle façon d'exprimer la nouvelle relation, sans affecter les anciennes données.

  2. Toujours sauvegarde la base de données avant le déploiement.

mon sens est-après avoir lu ce après cela, 90% des participants à cette discussion sont horrifiés à l'idée d'utiliser des automations comme celle-ci dans un environnement de production. Certains lancer la balle à la DBA. Prenez un moment pour considérer que ce ne sont pas tous les environnements de production qui fourniront un DBA et que peu d'équipes de développement sont capables de s'en payer un (au moins pour les projets de taille moyenne). Donc, si nous parlons d'équipes où tout le monde doit tout faire, la balle est sur eux.

Dans ce cas, pourquoi ne pas essayer d'avoir le meilleur des deux mondes? Des outils comme celui - ci sont là pour donner un coup de main, qui - avec une conception et un plan soignés-peut aider dans de nombreuses situations. Et croyez-moi, les administrateurs peuvent d'abord être difficile à convaincre, mais si ils savent que la balle n'est pas entre leurs mains, ils vont l'adorer.

personnellement, je ne retournerais jamais à écrire des scripts à la main pour étendre n'importe quel type de schéma, mais c'est juste mon opinion. Et après en commençant à adopter NoSQL bases de données sans schéma récemment, je peux voir que plus que bientôt, toutes ces opérations basées sur Schéma appartiendront au passé, donc vous feriez mieux de commencer à changer votre point de vue et de regarder vers l'avenir.

7
répondu chris 2011-03-10 11:50:19

Je ne le risquerais pas parce que vous pourriez finir par perdre des données qui auraient dû être préservées. hbm2ddl.auto=update est un moyen simple de garder votre base de données dev à jour.

6
répondu Jaap Coomans 2008-10-21 10:44:24
  • dans mon cas (Hibernate 3.5.2, Postgresql, Ubuntu), le réglage hibernate.hbm2ddl.auto=update seulement créé de nouvelles tables et créé de nouvelles colonnes dans les tables déjà existantes.

  • il ne supprimait ni les tableaux, ni les colonnes, ni ne modifiait les colonnes. Il peut être appelé une option sûre, mais quelque chose comme hibernate.hbm2ddl.auto=create_tables add_columns serait plus clair.

5
répondu user1027272 2014-04-04 06:48:34

Non, ne le fais jamais. Hibernation ne gère pas la migration des données. Oui, il va faire votre schéma regarder correctement, mais il ne garantit pas que les données de production précieuses ne sont pas perdus dans le processus.

4
répondu Robert 2011-02-15 21:49:17

ce n'est pas sûr, pas recommandé, mais c'est possible.

j'ai de l'expérience dans une application utilisant l'option de mise à jour automatique en production.

Eh bien, les principaux problèmes et risques trouvés dans cette solution sont:

  • déployer dans la mauvaise base de données . Si vous commettez l'erreur pour exécuter le serveur d'application, avec une ancienne version de l'application (OREILLE/GUERRE/etc) dans la mauvaise base de données... Vous ont beaucoup de nouvelles colonnes, des tableaux, des clés étrangères et des erreurs. Le même problème peut se produire avec une simple erreur dans le fichier datasource, (copier/coller le fichier et oublié de changer la base de données). En résumé, la situation peut être un désastre dans votre base de données.
  • Application serveur met trop de temps à démarrer . Cela se produit parce que le Hibernate essayer de trouver toutes les tables/colonnes/etc créés chaque fois que vous démarrez l'application. Il fait cela pour savoir ce qu' (tableau, colonne, etc) doivent être créées. Ce problème ne s'aggrave.
  • outils de base de données il est presque impossible d'utiliser . Pour créer des scripts pour la base de données, vous devez penser à ce qui sera créé par la mise à jour automatique après le démarrage du serveur d'application. Si vous devez remplir une nouvelle colonne (par exemple), avec quelques données, vous devez démarrer le serveur d'application, attendre pour Hibernate crète la nouvelle colonne et exécutez le script SQL d'après. Des outils comme Flyway il est presque impossible à utiliser avec auto-update activé.
  • les modifications à la base de données ne sont pas centralisées . Avec la possibilité de L'hibernation créer les tables et tout le reste, il est difficile de regarder les changements sur la base de données dans chaque version de l'application, parce que la plupart d'entre eux sont automatiquement.
  • encourage les ordures dans la base de données . En raison de la facilité de mise à jour automatique, Il ya une chance de votre équipe en négligeant la chute de vieilles colonnes et tableaux anciens.
  • catastrophe imminente . Le risque imminent qu'une catastrophe se produise dans la production (comme certaines personnes mentionnées dans d'autres réponses). Même avec une application qui fonctionne et peut être mise à jour pendant des années, je ne pense pas que ce soit sûr. Je n'ai jamais senti en danger.

donc, je ne recommande pas d'utiliser auto-update en production.

si vous voulez vraiment utiliser auto-update dans production, je recommande:

  • réseaux séparés . Votre environnement de test ne peut pas accéder à l'environnement homolog. Cela permet d'empêcher un déploiement qui était censé se trouver dans l'environnement D'essai de modifier la base de données D'Homologation.
  • Gérer les scripts de commande . Vous devez organiser vos scripts pour les exécuter avant votre déploiement (changement de table de structure, déposer table/colonnes) et le script après le déploiement (remplir les informations pour les nouvelles colonnes, tableaux).

et, différent des autres postes, Je ne pense pas que l'auto-mise à jour activé il est lié avec "très bien payé" DBA (comme mentionné dans d'autres postes)... Les AD ont des choses plus importantes à faire que D'écrire des instructions SQL pour créer/modifier/supprimer des tables et des colonnes. Ces tâches quotidiennes simples peuvent être faites et automatisées par les développeurs et seulement passés pour l'équipe DBA à l'examen, n'ayant pas besoin D'hibernation et les AD "très bien payé" à écrire.

4
répondu Dherik 2018-03-22 16:04:41
  • " typiquement les applications d'entreprise dans les grandes organisations fonctionnent avec des privilèges réduits.

  • nom d'utilisateur de la base de données peut ne pas avoir DDL privilège pour ajouter des colonnes qui hbm2ddl.auto=update nécessite.

3
répondu Aniket Kulkarni 2014-04-04 06:49:27

Je suis D'accord avec Vladimir. Les administrateurs de mon entreprise n'apprécieraient certainement pas que je propose un tel cours.

en outre, la création d'un script SQL au lieu d'hibernation aveuglément confiante vous donne l'occasion de supprimer les champs qui ne sont plus utilisés. Hibernate ne pas le faire.

et je trouve que la comparaison du schéma de production avec le nouveau schéma vous donne un meilleur aperçu de ce que vous avez changé dans le modèle de données. Vous bien sûr, parce que tu l'as fait, mais maintenant tu vois tous les changements d'un coup. Même ceux qui te font dire: "qu'est-ce qui se passe?!".

il y a des outils qui peuvent faire un delta de schéma pour vous, donc ce n'est même pas un travail difficile. Et puis vous savez exactement ce qui va arriver.

2
répondu extraneon 2008-10-21 17:40:09

le schéma des Applications peut évoluer dans le temps; si vous avez plusieurs installations, qui peuvent être à différentes versions, vous devriez avoir un moyen de vous assurer que votre application, une sorte d'outil ou de script est capable de migrer le schéma et les données d'une version stepwise vers une autre suivante.

avoir toute votre persistance dans les mappages (ou annotations) D'hibernation est un très bon moyen de garder l'évolution de schema sous contrôle.

vous devriez considérez que l'évolution du schéma a plusieurs aspects à considérer:

  1. évolution du schéma de base de données dans ajouter d'autres colonnes et tableaux

  2. suppression des anciennes colonnes, tableaux et relations

  3. remplir les nouvelles colonnes par défaut

les outils D'hibernation sont importants en particulier dans le cas (comme dans mon expérience) vous avez différentes versions de la même application sur de nombreux types différents de bases de données.

Point 3 est très sensible dans le cas où vous utilisez Hibernate, comme dans le cas où vous introduisez une nouvelle propriété de valeur booléenne ou numérique, si Hibernate trouvera une valeur nulle dans ces colonnes, si soulèvera une exception.

donc ce que je ferais est: utilisez en effet la capacité des outils D'hibernation de mise à jour de schéma, mais vous devez ajouter à côté de cela quelques données et schema maintenance callback, comme pour le remplissage par défaut, ne laissant plus tomber les colonnes utilisées, et similaire. De cette façon, vous obtenez les avantages (base de données indépendante des scripts de mise à jour de schema et éviter le codage dupliqué des mises à jour, en péristance et en scripts) mais vous couvrez également tous les aspects de l'opération.

donc par exemple si une mise à jour de version consiste simplement à ajouter une propriété varchar valorisée (donc colonne), qui peut être par défaut à null, avec auto update vous serez faire. D'où la complexité est nécessaire, plus les travaux seront nécessaires.

cela suppose que l'application mise à jour est capable de mettre à jour son schéma (cela peut être fait), ce qui signifie également qu'elle doit avoir les droits d'utilisateur pour le faire sur le schéma. Si la politique du client l'empêche (probablement un cas de cerveau de lézard), vous devrez fournir les scripts spécifiques à la base de données.

2
répondu Pietro Polsinelli 2010-04-26 19:47:13