powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Странная ошибка при работе с БД
17 сообщений из 17, страница 1 из 1
Странная ошибка при работе с БД
    #38997506
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Столкнулась со следующей проблемой.
Перевела все таблицы с MyIsam на InnoDB. При поднятии проекта в логах пишет следующую ошибку:
Код: java
1.
2.
2015-07-02 12:21:49,186 ERROR SchemaUpdate - HHH000388: Unsuccessful: alter table client_orders add constraint FK_lfrqnao0hykvndsn0gryc8i9s foreign key (client_id) references client (id)
2015-07-02 12:21:49,186 ERROR SchemaUpdate - Can't create table 'mydb.#sql-25b8_17' (errno: 150)


Более того, теперь при выполнении запроса:
Код: java
1.
2.
3.
4.
5.
6.
7.
        Criteria criteria = session.createCriteria(Client.class);
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        criteria.createAlias("clientInfo", "client");
        ...........
        criteria.setFirstResult((numPage - 1) * pageSize);
        criteria.setMaxResults(pageSize);
        List<Client> listClient = criteria.list(); 


для вывода списка клиентов по параметрам, все зависает и начинает сжирается место на диске, минут через 5 все очухивается и информация все же выдается. При переводе базы обратно в MyIsam этот же код при тех же условиях отрабатывает мгновенно. Что может быть, помогите плиз.
Спасибо
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38997508
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понимаю что в hibernate стоит drop - create ?
вручную прогнать пробовали?
у инно DB вроде и диалект другой(здесь об этом говорил http://stackoverflow.com/questions/1459265/hibernate-create-mysql-innodb-tables-instead-of-myisam)
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38997510
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingя так понимаю что в hibernate стоит drop - create ?
вручную прогнать пробовали?
у инно DB вроде и диалект другой(здесь об этом говорил http://stackoverflow.com/questions/1459265/hibernate-create-mysql-innodb-tables-instead-of-myisam)
в пропертис стоит:
hibernate.hbm2ddl.auto=update
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38997517
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Ну, сколько можно повторять, не используйте никогда hbm2ddl и переходите на liquibase или flyway.
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38997530
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulT,

Ну, сколько можно повторять, не используйте никогда hbm2ddl и переходите на liquibase или flyway.
я не использую в продакшене hbm2ddl, но теперь вовсе про него забуду).
а что можете сказать по моей проблеме? как исправить этот долгий затык?
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38997534
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTя не использую в продакшене hbm2ddl, но теперь вовсе про него забуду).
а что можете сказать по моей проблеме? как исправить этот долгий затык?
Судя по описанию, client (id) не объявлен первичным ключом почему-то.
Can't create table 'mydb.#sql-25b8_17' (errno: 150), вроде как следствие того что FK не может ссылаться на колонку, которая не является PK.
Ну, и соответственно тормозит выборка, так как без PK нет и индекса.
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38997580
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно подумать, замена hbm2ddl на liquibase или flyway тут что-то поменяет.
Надо разбираться с внешним ключом в client_orders - неудача при его формировании говорит, скорее всего, о потере целостности данных.
И даже правильно, что hibernate.hbm2ddl.auto=update в отладке используется, без него эта проблема вылезла бы потом на продакшене. А на MyIsam не было проблем просто потому, что там внешние ключи не поддерживаются
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38997618
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraМожно подумать, замена hbm2ddl на liquibase или flyway тут что-то поменяет.
Хера себе заява. Абы какая структура данных поменяется на ту что создал аккуратно руками.

ivanraНадо разбираться с внешним ключом в client_orders - неудача при его формировании говорит, скорее всего, о потере целостности данных.
Не с внешним, а с первичным.

ivanraИ даже правильно, что hibernate.hbm2ddl.auto=update в отладке используется, без него эта проблема вылезла бы потом на продакшене. А на MyIsam не было проблем просто потому, что там внешние ключи не поддерживаются
Фак мой мозг. Маппинг и БД две разные проблемы. Ничего правильного в hbm2ddl нет. Это исключительно инструмент быстрого прототипизирования.
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38997664
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
в умелых руках hbm2ddl покрывает 99% потребностей для создания правильных структур. 1% - это уникальные для конкретного движка типы полей и индексы (но это больше относится не к структурам, а к аналитике и производительности). И если этот 1% не используется в проекте, зачем добавлять лишний слой с ddl? Не вижу аргументов.
По ошибке - в логе же явно написано про внешний ключ. Первичный ключ 100% есть, hbm2ddl его бы не пропустил. Ошибка именно в ссылочной целостности - в client_orders есть записи с несуществующим client_id.
Что касается тормозов при выборке из таблицы client - кроме внешнего ключа надо еще проверить меппинг связи client - client_orders. Возможные причины торомозов - двустороннесть и жадность связи
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38999146
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередная магическая ситуация....
Как я уже писала выше, вот такой запрос выполняется от 5 до 10 минут (даже при выводе 1 строчки)
Код: java
1.
2.
3.
4.
5.
6.
7.
Criteria criteria = session.createCriteria(Client.class);
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        criteria.createAlias("clientInfo", "client");
        ...........
        criteria.setFirstResult((numPage - 1) * pageSize);
        criteria.setMaxResults(pageSize);
        List<Client> clientList = criteria.list(); 


А если делаю так:
Код: java
1.
2.
3.
4.
Query query = session.createQuery("From Client");
            query.setFirstResult((numPage - 1) * pageSize);
            query.setMaxResults(pageSize);
            List<Client> clientList = query.list();


то все выполняется мгновенно. НУ КАК ТАКОЕ МОЖЕТ БЫТЬ????
Индексы все перестроены, ошибок нет, перекрестных EAGER-ов нет, жесть...
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38999192
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT,
есть
Код: java
1.
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

и есть загадочное многоточие, доступное только телепатам.
Если внутри многоточия критерий, возвращающий большое множество (n строк), то результат закономерен (O(n 2 )), даже если возвращаемое множество ограничивается потом одной строкой
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38999279
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://stackoverflow.com/questions/25536868/criteria-distinct-root-entity-vs-projections-distinct

Код: sql
1.
2.
3.
4.
Query query = session.createQuery("From Client");
            query.setFirstResult((numPage - 1) * pageSize);
            query.setMaxResults(pageSize);
            List<Client> clientList = query.list();



это вроде как отдать записей начиная с (numPage - 1) * pageSize, pageSize штук


Код: sql
1.
2.
3.
4.
5.
6.
7.
Criteria criteria = session.createCriteria(Client.class);
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        criteria.createAlias("clientInfo", "client");
        ...........
        criteria.setFirstResult((numPage - 1) * pageSize);
        criteria.setMaxResults(pageSize);
        List<Client> listClient = criteria.list(); 



а это получить ВСЕ записи из DB и затем Hibernate уже выберет нужные.

Если сортировку добавить наверняка еще веселей будет .
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38999280
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если записей много то в первом случае тупо например с 10000 по 11111 Hibernate вытащит.
во втором случае если в таблице 1000 000 то он долго будет по сети их получать и потом выковыривать нужные самостоятельно.

distinct или order будет еще медлеее т.к. paging подразумевает сортировку по какому либо полю.
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #38999351
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraJulT,
есть
Код: java
1.
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

и есть загадочное многоточие, доступное только телепатам.
Если внутри многоточия критерий, возвращающий большое множество (n строк), то результат закономерен (O(n 2 )), даже если возвращаемое множество ограничивается потом одной строкой
А вместо многоточия возможные фильтры запроса, например:
Код: java
1.
2.
3.
if (clientId != 0) {
                criteria.add(Restrictions.eq("client.id", clientId));
    }


clientId=0 - значит вывести всех клиентов, их в базе 100 тысяч, я думала, что:
Код: java
1.
2.
        criteria.setFirstResult(0);
        criteria.setMaxResults(1);


выведет мне одного клиента, а получается хибернейт вытягивает все 100 тысяч и уже после обрезает? вот это новость
а как же быть если фильтра нет?
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #39000298
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и до сих пор не понятно, почему если база в MyISAM все летает при тех же 100 тысячах данных
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #39000312
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,
в умелых руках hbm2ddl покрывает 99% потребностей для создания правильных структур.
Это заблуждение. Такой подход работает только до тех пор когда можно всё грохнуть и создать с нуля. Когда же появляются production данные, которые нельзя терять, а миграцию продолжать нужно, то hbm2ddl и 50% не покроет.
...
Рейтинг: 0 / 0
Странная ошибка при работе с БД
    #39000478
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulTну и до сих пор не понятно, почему если база в MyISAM все летает при тех же 100 тысячах данных
Это действительно загадка, хотя MyISAM и отдает данные быстрее.

А от этого надо избавляться, если запрос может возвращать большие множества:
Код: java
1.
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

Даже из названия метода видно, что обрабатывается результат, а из вышенаписанного следует, что это может быть и 100000 записей. И всё это передается на клиент (и даже больше, в зависимости от fetch mode для связанных таблиц), чтобы потом выбрать одну страницу для показа.
- переделать метод так, чтобы запрос выполнялся на сервере, используя Projections.distinct и субкритерии;
- для связанных таблиц убедиться, что создались внешние ключи;
- ну и включить на время SQL трассировку, убедиться, что в формируемых запросах есть слова LIMIT и OFFSET
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Странная ошибка при работе с БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]