#java #mysql #jdbc #sql-delete #failover
#java #mysql #jdbc #sql-удалить #отказоустойчивость
Вопрос:
Скажем, у меня есть таблица example1
, и я использую инструкцию jdbc для удаления одной из ее строк. Я пробовал различные методы, от delete from example1 where id = 1
до statement.addbatch(sql)
, но строка не удаляется. Если я выполню ту же инструкцию sql в Toad для Mysql, она сможет удалить строку просто отлично.
Странно то, что с помощью jdbc я могу просто отлично удалять строки из других таблиц; просто эта конкретная таблица дает мне неожиданные результаты.
В этой таблице нет ничего особенного. У него есть первичный ключ и нет связей ограничений / внешнего ключа.
Кроме того, это удаление является частью транзакции, поэтому для автоматической фиксации установлено значение false
, и как только все записи обновляются / вставляются / удаляются, фиксация выполняется. Похоже, что у этого нет никаких проблем с какой-либо другой таблицей, и все обновления / удаления / вставки выполняются просто отлично.
С точки зрения разрешений эта таблица имеет те же права доступа для пользователя БД, что и любая другая таблица в БД.
Любые идеи или указания будут высоко оценены!
Комментарии:
1. Вы подтвердили, что оператор запускается из java?
2. вы отметили этот переход на другой ресурс, но не упомянули об этом в сообщении — почему? и вы уверены, что ничто другое не вставляет эту запись одновременно с ее удалением?
3. Мне пришлось пометить ее отказоустойчивостью, потому что не было тега «сбой» или «failed», и у меня нет разрешений на создание новых тегов.
4. Не могли бы вы опубликовать структуру таблицы и код, который вы используете для выполнения запроса, пожалуйста?
5. Что вы подразумеваете под «запуском из Java»? не могли бы вы, пожалуйста, объяснить? У меня есть инструкции debug я также выполняю отладку в eclipse и вижу, как выполняется оператор .. system.out.println также печатает запрос и результат int[], длина которого равна нулю. Больше ничего не вставляется в эту таблицу. Входные данные в этой таблице вставляются с помощью хранимой процедуры, которая вызывается, когда пользователь в графическом интерфейсе удаляет что-либо из table..so в принципе, любое удаление в другой таблице приведет к появлению записи в этой таблице для этой удаленной записи с информацией об этой записи.
Ответ №1:
Включение общего ведения журнала в базе данных или профилирования в драйвере JDBC покажет вам, что на самом деле происходит в базе данных:
http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html
Включите профилирование запросов для Connector / J, добавив это в строку подключения: profileSQL= true
Общая документация по протоколированию:http://dev.mysql.com/doc/refman/5.1/en/query-log.html
Существует также mk-query-digest для отслеживания вашего сетевого трафика и анализа результатов: http://www.maatkit.org/doc/mk-query-digest.html
Комментарии:
1. Спасибо Джошуа. Позвольте мне попробовать это.
2. Я нашел issue…it была ошибка в моем коде. Я выполнял удаление при неправильном подключении… Мне нужно было выполнить его при подключении к источнику, но я выполнял его при подключении к целевой базе данных, и поскольку эти записи не существуют в target, он не смог их удалить. Ссылки Джошуа помогли мне переоценить мои настройки, связанные с подключением, и я обнаружил реальную проблему.
Ответ №2:
Я столкнулся с такой же ситуацией
Я помню, что в запросе была определенная ошибка, попробуйте выполнить запрос в mysql sqlyog или любом графическом интерфейсе и проверьте, работает ли это, я на 100% уверен, что это не сработает
затем исправьте запрос и проверьте его
Комментарии:
1. Как я уже сказал, я копирую и вставляю запрос из system.out.println в toad для mysql, и это работает просто отлично. Я имею в виду, насколько сложным может быть запрос типа «удалить из example1, где id = 1»? Это вызовет исключение sqlexception при наличии синтаксической ошибки… Я даже проверяю наличие SQLWarnings, но там ничего нет.