Попытка удалить строки в базе данных oracle старше 1 часа, что приведет к тайм-ауту
У меня странная проблема, которую я не могу исправить.
Я пытаюсь удалить все строки, отметка времени которых превышает 1 час.
SQL:
DELETE FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - 1/24
Весь код прекрасно работает в SQL Developer, но когда я пытаюсь сделать то же самое в iBatis.net, я получаю тайм-ауты.
<statements>
<delete id="DeleteRows" parameterClass="int">
<![CDATA[
DELETE FROM TABLE WHERE TIMESTAMP <= SYSTIMESTAMP - #VALUE#/24
<!--THIS DON'T WORK-->
]]>
</delete>
</statements>
Другая странная вещь заключается в том, что проблемы не существует, когда я передаю оператор меньше, чем "равный", например
<statements>
<delete id="DeleteRows" parameterClass="int">
<![CDATA[
DELETE FROM TABLE WHERE TIMESTAMP = SYSTIMESTAMP - #VALUE#/24
<!--THIS WORK-->
]]>
</delete>
</statements>
Таймауты выдаются только с операторами Les-than и Grater-than и только в iBatis.net. Кто-нибудь знает, почему?
Забавный факт Когда я запрашиваю DELETE FROM TABLE WHERE TIMESTAMP < '07-AUG-11'
это работает. Также, когда я пытаюсь сделать запрос DELETE FROM TABLE WHERE TIMESTAMP BETWEEN '07-AUG-11' AND SYSTIMESTAMP
это тоже работает. Кажется, проблема только с <
а также >
в сочетании с SYSTIMESTAMP
Есть ли другой способ удалить строки старше одного часа без использования этих операторов? Спасибо
2 ответа
Добавление ответа на мой вопрос, потому что я смог решить его, возможно, кому-то это понадобится в будущем.
Сначала я создал новый запрос выбора:
<select id="DbTime" resultClass="DateTime">
<![CDATA[SELECT SYSTIMESTAMP FROM DUAL]]>
</select>
Затем я запускаю этот выбор
DateTime currentDate = DataSources.DB.QueryForObject<DateTime>("Map.DbTime", null);
DateTime finalDate= currentDate.AddHours(-24);
И пройти finalDate
как параметр
<delete id="DeleteRows">
<![CDATA[
DELETE FROM TABLE WHERE TIMESTAMP < #value#
]]>
</delete>
Сейчас он работает, но до сих пор не знаю, почему мое первое решение хочет работать.
Вам может понадобиться
a) Увеличьте CommandTimeout для вашей DbCommand, выполняющей запрос (не уверен, как это сделать в iBatis.NET)
б) Проверьте, есть ли у вас открытая транзакция, которая вызывает тупик (команда удаления, ожидающая доступности строк), см. Просмотр открытых транзакций в Oracle