Quelqu'un sait-il s'il est possible d'utiliser mySQL Cluster avec Hibernate ?
Réponses
Trop de publicités?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.
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.
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
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;
}
}