4 votes

MySQL NDB Cluster + Hibernate

Quelqu'un sait-il s'il est possible d'utiliser mySQL Cluster avec Hibernate ?

7voto

Pascal Thivent Points 295221

Tout d'abord, une partie importante de la question concerne la prise en charge du pilote JDBC et il semble que vous puissiez utiliser JDBC (Connector/J) avec MySQL Cluster (voir cet article de blog ), on peut donc imaginer déclarer une telle URL JDBC dans la configuration d'Hibernate.

Ensuite, ma compréhension de la Aperçu du cluster MySQL est que les nœuds de données sont considérés comme un tout (à partir de la documentation), si une application met à jour le salaire d'un employé, tous les autres serveurs MySQL qui interrogent ces données peuvent voir ce changement immédiatement ), ce qui devrait satisfaire Hibernate.

Cependant, si vous souhaitez qu'Hibernate crée des tables en utilisant le moteur NDB, vous aurez besoin d'un dialecte spécial (voir HHH-1496 ). Rien de bien compliqué cependant.

En théorie, tout semble donc aller pour le mieux. En pratique, I Je n'ai pas d'expérience dans ce domaine.

3voto

gnomie Points 311

Nous utilisons MySQL NDB avec Hibernate et cela fonctionne sans aucune adaptation dans Hibernate et nous n'avons pas observé de problèmes de cohérence. NDB se comporte cependant différemment de InnoDB, en particulier pour les grands ensembles de données. Les index doivent tenir dans la mémoire, le système est plutôt raisonnable lorsqu'il s'agit de transactions de longue durée, et il y a des limites au nombre de lignes que vous pouvez verrouiller (vous pouvez les modifier, mais un simple "delete from T where x<5" peut fonctionner ou échouer en fonction du nombre de lignes qui doivent être verrouillées). Ce n'est donc pas Hibernate mais le SQL créé par Hibernate qui peut ne pas fonctionner comme prévu sur NDB.

1voto

sebi Points 608

Étendre MySQL5Dialect. Voici un exemple :

public class CustomMySQL5Dialect extends MySQL5Dialect {
    public String getTableTypeString() {
        return " engine=ndb";
    }
}

1voto

Steve Ebersole Points 3544

Certaines fonctionnalités d'Hibernate ne fonctionneront absolument pas avec les clusters MySQL NDB, simplement en raison de limitations du côté de la base de données et du pilote MySQL. L'une d'entre elles est qu'Hibernate utilise des tables temporaires pour implémenter des mises à jour/suppressions en masse sur des structures multi-tables (tables secondaires, sous-classes jointes, etc.). Mais MySQL NDB ne prend pas en charge les tables temporaires. Consultez la page sur les limitations de MySQL NDB pour en savoir plus sur les limitations spécifiques de NDB et savoir si elles peuvent vous concerner : http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-limitations.html

1voto

coolersport Points 41

Pour aider les lecteurs suivants, nous utilisons NDBCluster avec Hibernate dans nos applications à haute performance (supportant des milliers d'utilisateurs simultanés) depuis plus de 4 ans maintenant. Notez qu'avant la version 7.3.1, MySQL NDB ne supporte pas les contraintes de clés étrangères ( http://dev.mysql.com/doc/relnotes/mysql-cluster/7.3/en/mysql-cluster-news-5-6-10-ndb-7-3-1.html ). Nous avons donc dû écrire un petit utilitaire pour auto-injecter les déclencheurs nécessaires (voir http://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html ).

NDB antérieur à la version 7.3.1, vous pouvez utiliser quelque chose comme ceci :

public class MySQL5NDBDialect extends MySQLDialect
{
    private static final String ENGINE_NDB = " ENGINE=NDB"; //$NON-NLS-1$

    @Override
    public boolean supportsCascadeDelete()
    {
        return false;
    }

    @Override
    public boolean dropConstraints()
    {
        return false;
    }

    @Override
    public String getTableTypeString()
    {
        return ENGINE_NDB;
    }

    @Override
    public String getAddForeignKeyConstraintString(final String constraintName, final String[] foreignKey,
        final String referencedTable, final String[] primaryKey, final boolean referencesPrimaryKey)
    {
        // our magic to inject triggers
    }
}

NDB 7.3.1 et supérieur sera plus simple :

public class MySQLNDB7Dialect extends MySQLDialect
{
    private static final String ENGINE_NDB = " ENGINE=NDB"; //$NON-NLS-1$

    @Override
    public boolean supportsCascadeDelete()
    {
        return true;
    }

    @Override
    public boolean dropConstraints()
    {
        return true;
    }

    @Override
    public String getTableTypeString()
    {
        return ENGINE_NDB;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X