Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Переименование таблицы и jdbc-пул / 5 сообщений из 5, страница 1 из 1
28.01.2016, 12:26
    #39157325
Batsall
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переименование таблицы и jdbc-пул
Добрый день, товарищи.
Подскажите, пожалуйста, по такому вопросу. Фрагментировал большую таблицу. Таблица настолько большая, что через alter table fragment init не получилось, поэтому создал рядом такую же, но с фрагментацией, перелил в нее данные и rename`ом поменял их местами. Проверил работоспособность приложения и дропнул старую таблицу. Все это производилось через отдельную сессию (ну кроме приложения), никак не связанную с пулом jdbc-сессий приложения. Но, когда я после дропа еще раз попытался проверить работоспособность приложения, получил странную ошибку - при prepareStatment вставки записи в третью таблицу, на которую однако старая таблица имела внешний ключ, получил следующее:

The specified table <имя дропнутой таблицы> is not in database. (code=-206): ISAM error: no record found. (code=-111).

Перезапуск сервера приложений помог, но я не могу понять, что именно произошло - реконнект к бд или сброс какого-то кеша jdbc-пула.
Вопрос - почему субд все еще пытается производить какие-то операции над несуществующим объектом? Или виновата не субд, а пул jdbc-соединений? Но как он мог узнать о переименовании таблицы?
...
Рейтинг: 0 / 0
29.01.2016, 00:50
    #39158055
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переименование таблицы и jdbc-пул
Batsall,

При завершении работы сервера приложений все его клиентские соединения были завершены. Соответственно, память на сервере СУБД, отвечающая за эти соединения, хранящая в том числе скомпилированные SQL-запросы (prepareStatement-ы), указатели на табличные пространства и т.д., была освобождена. При повторном старте сервера приложения его новые соединения при компиляции SQL-запросов получили уже обновленную информацию о том где хранятся данные.

В теории такой ситуации быть не должно. Поскольку сервер приложений имел preparedStatement на таблицу, то в памяти на сервере СУБД должна была храниться блокировка на нее (или на запись в таблице sysmaster со значением tabname == имя таблицы). При наличии такой блокировки изменения таблицы невозможны. По всей видимости, или оператору RENAME пофигу эта блокировка, или имеется в наличии баг в работе сервера СУБД. Кстати, неплохо было бы узнать версию сервера СУБД и версию CSDK на сервере приложений.

В любом случае повторный PREPARE помог исправить ситуацию. Кстати, а сервер СУБД не перезапускался? Я бы на вашем месте его бы тоже перезагрузил на всякий случай.
...
Рейтинг: 0 / 0
29.01.2016, 11:08
    #39158316
Batsall
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переименование таблицы и jdbc-пул
Спасибо за столь объемный ответ. Версия субд 11.7, csdk не используется - просто jdbc драйвер и пул на сфере.
Я бы даже согласился, с багом rename`а, но проблема в том, что тогда получается бага не только у rename`а, а еще и у drop`а. Насколько я понимаю, любая ddl операция над таблицей должна инвалидировать все скомпилированные запросы, в которых эта таблица участвует.
У меня складывается ощущение, что проблема в том, что drop detail-таблицы не влияет на валидность плана запроса вставки записи в master, но при исполнении она (detail) все таки затрагивается. Видимо надо каким-то образом выкинуть таки эти скомпилированные запросы из памяти, например "пустым" ddl над master-таблицей, но что-то это все мне уже напонимает шаманство. Проще сервер перегрузить, чем все связи и зависимости вычислять. Вариант с повторным prepare тоже не очень удачный, т.к. пользователи все-таки получат по ошибке на каждую сессию пула.
А для чего перезагружать БД? Это уже совсем ни в какие рамки не лезет, чтобы после каждого rename/drop бд перегружать...
...
Рейтинг: 0 / 0
29.01.2016, 21:47
    #39158984
Переименование таблицы и jdbc-пул
victor16В любом случае повторный PREPARE помог исправить ситуацию. Кстати, а сервер СУБД не перезапускался? Я бы на вашем месте его бы тоже перезагрузил на всякий случай.

"Сервер СУБД" это физический/виртуальный сервер с операционкой ?

Зачем его-то ????????
...
Рейтинг: 0 / 0
31.01.2016, 09:14
    #39159373
victor16
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переименование таблицы и jdbc-пул
Яковлев Павелvictor16В любом случае повторный PREPARE помог исправить ситуацию. Кстати, а сервер СУБД не перезапускался? Я бы на вашем месте его бы тоже перезагрузил на всякий случай.

"Сервер СУБД" это физический/виртуальный сервер с операционкой ?

Зачем его-то ?

В ранних версиях 11.7 было несколько багов, связанных с повторным PREPARE, особенно в SPL. В качестве workaround техподдержка рекомендует обновиться до актуальной версии, а если это невозможно - rebounce engine. О перезагрузке ОС речи не идет.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Переименование таблицы и jdbc-пул / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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