MySQL NDB Cluster + Hibernate - PullRequest
       5

MySQL NDB Cluster + Hibernate

4 голосов
/ 07 июня 2010

Кто-нибудь знает, можно ли использовать MySQL Cluster с Hibernate?

Ответы [ 5 ]

7 голосов
/ 07 июня 2010

Прежде всего, важной частью вопроса является поддержка драйвера JDBC, и кажется, что вы можете использовать JDBC (Connector / J) с MySQL Cluster (см. этот пост ), так что можно представить объявление такого URL JDBC в конфигурации Hibernate.

Затем, мое понимание MySQL Cluster Overview заключается в том, что узлы данных рассматриваются как единое целое (из документации , если одно приложение обновляет зарплату сотрудника, все остальные серверы MySQL, которые запросите эти данные, чтобы увидеть это изменение немедленно ), поэтому Hibernate должен быть доволен этим.

Однако, если вы хотите, чтобы Hibernate создавал таблицы с использованием механизма NDB, вам понадобится специальный диалект (см. HHH-1496 ). Ничего сложного, хотя.

Так что в теории все вроде бы нормально. На практике I не имеет никакого опыта в такой настройке.

3 голосов
/ 24 сентября 2012

Мы используем MySQL NDB с Hibernate, и он работает без какой-либо адаптации в Hibernate, и мы не наблюдали проблем согласованности. Однако NDB ведет себя иначе, чем InnoDB, особенно с большими наборами данных. Индексы должны вписываться в память, это довольно разумно, когда речь идет о длительных транзакциях, и есть ограничения на количество строк, которые вы можете заблокировать (вы можете настроить их, но все равно безвредно выглядите «удалить из T, где x <5») может работать или не работать в зависимости от того, сколько строк необходимо заблокировать). Таким образом, это не Hibernate, а SQL, созданный Hibernate, который может работать не так, как вы ожидали в NDB. </p>

1 голос
/ 19 июня 2014

Чтобы помочь следующим читателям, мы используем NDBCluster с Hibernate в наших высокопроизводительных приложениях (поддержка тысяч одновременных пользователей) уже более 4 лет. Обратите внимание, что до версии 7.3.1 MySQL NDB не поддерживает ограничения внешнего ключа (http://dev.mysql.com/doc/relnotes/mysql-cluster/7.3/en/mysql-cluster-news-5-6-10-ndb-7-3-1.html).. Поэтому нам пришлось написать небольшую утилиту для автоматического ввода необходимых триггеров (см. http://dev.mysql.com/tech-resources/articles/mysql-enforcing-foreign-keys.html).

NDB старше 7.3.1, вы можете использовать что-то вроде этого:

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 и выше будет проще:

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;
    }
}
1 голос
/ 30 июля 2012

Некоторые функции Hibernate абсолютно не будут работать с кластерами MySQL NDB просто из-за ограничений со стороны базы данных / драйвера MySQL. Одним из главных моментов в моей голове является то, что Hibernate использует временные таблицы для реализации массовых обновлений / удалений в структурах с несколькими таблицами (вторичные таблицы, объединенный подкласс и т. Д.). Но MySQL NDB не поддерживает временные таблицы. Взгляните на страницу ограничений MySQL NDB, чтобы узнать более конкретные ограничения NDB и узнать, могут ли они повлиять на вас: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-limitations.html

1 голос
/ 09 мая 2012

Расширение MySQL5Dialect. Это пример:

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