2015-08-12 5 views
0

я определил этот метод картографа:Усечение не всегда работает: почему?

@Delete("truncate table MY_TABLE") 
public void wipeAllData(); 

и обычно работает ... все равно иногда не ... есть ли конкретная причина/известная ошибка для этого?

Я использую mybatis 3.3.0 с oracle 11g в качестве СУБД.

+0

Что вы MySQL версии? –

+0

Привет, мой dbms oracle11g, возможно, вы имели в виду версию mybatis? Это 3.3.0 – Phate

+0

Я предположил mysql. Я обновляю свой ответ с помощью надлежащих документов. –

ответ

2

EDIT

Поскольку вы добавили oracle11g тег. Мой предыдущий ответ более недействителен, по крайней мере, не потому, что он не будет работать. Поэтому я отредактировал его.

Есть причины, по которым я знаю, почему иногда он не работает в ORACLE. В соответствии с документами ORACLE

Вы не можете индивидуально обрезать таблицу, являющуюся частью кластера. Вы должны либо обрезать кластер, удалить все строки из таблицы, либо перетащить и заново создать таблицу.

Вы не можете усечь родительскую таблицу ограничения включенного внешнего ключа. Вы должны отключить ограничение перед усечением таблицы. Исключением является то, что вы можете обрезать таблицу, если ограничение целостности является самореференциальным.

Вы не можете обрезать родительскую таблицу таблицы с разделением ссылок. Сначала вы должны удалить дочернюю таблицу с разделением ссылок.

Но вы должны знать, что использование или команда TRUNCATE не идеальны в области применения. Это должна быть операция, выполняемая только в базе данных. Причина заключается в другом признаке документов:

Если таблица не пуста, то база данных отмечает UNUSABLE все неразделенные индексы и все разделы глобальных секционированных индексов в таблице. Однако, когда таблица усечена, индекс также усекается, и для индексного сегмента рассчитывается новая отметка о высокой воде. Эта операция эквивалентна созданию нового сегмента для индекса. Поэтому в конце операции усечения индексы снова являются ИСПОЛЬЗОВАННЫМИ.

Таким образом, это может быть болезненно длинная операция в зависимости от индексов и размера стола.

Кроме того, для таблиц, имеющих ограничения, операция усечения не будет выпадать из таблицы, она будет удалять реестры по одному. Если у вас есть ON DELETE CASCADE на ваших ограничениях, в противном случае будет выдана ошибка. Это по-прежнему относится к базе данных оракула

Другое дело, будет должен знать о том,

Удаление строк с утверждением TRUNCATE TABLE может быть быстрее, чем удаление всех строк с ВЕЬЕТЕ, особенно если таблица имеет множество триггеров , индексы и другие зависимости.

Итак, если у вас есть триггер на этом столе, он ничего не сделает.

оригинальный DOC о TRUNCATE команды здесь: TRUNCATE TABLE

+0

Здравствуйте, это не похоже на мой случай: этот веб-метод вызывается только одним клиентом, и в этой таблице нет ограничений и триггеров. Плюс я не получаю сообщение об ошибке или исключение, делающее все еще более странным. – Phate

+0

Тогда я бы рекомендовал добавить некоторую структуру журнала и настроить экземпляр ibatis для отладки в течение нескольких дней, чтобы увидеть, что происходит. Может быть, какое-то внутреннее исключение бросается и где-то попадается. –

+1

Я попробую спасибо, очень информативный ответ в любом случае спасибо :) – Phate