|
Переименование таблицы и jdbc-пул
|
|||
---|---|---|---|
#18+
Добрый день, товарищи. Подскажите, пожалуйста, по такому вопросу. Фрагментировал большую таблицу. Таблица настолько большая, что через 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-соединений? Но как он мог узнать о переименовании таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 12:26 |
|
Переименование таблицы и jdbc-пул
|
|||
---|---|---|---|
#18+
Batsall, При завершении работы сервера приложений все его клиентские соединения были завершены. Соответственно, память на сервере СУБД, отвечающая за эти соединения, хранящая в том числе скомпилированные SQL-запросы (prepareStatement-ы), указатели на табличные пространства и т.д., была освобождена. При повторном старте сервера приложения его новые соединения при компиляции SQL-запросов получили уже обновленную информацию о том где хранятся данные. В теории такой ситуации быть не должно. Поскольку сервер приложений имел preparedStatement на таблицу, то в памяти на сервере СУБД должна была храниться блокировка на нее (или на запись в таблице sysmaster со значением tabname == имя таблицы). При наличии такой блокировки изменения таблицы невозможны. По всей видимости, или оператору RENAME пофигу эта блокировка, или имеется в наличии баг в работе сервера СУБД. Кстати, неплохо было бы узнать версию сервера СУБД и версию CSDK на сервере приложений. В любом случае повторный PREPARE помог исправить ситуацию. Кстати, а сервер СУБД не перезапускался? Я бы на вашем месте его бы тоже перезагрузил на всякий случай. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 00:50 |
|
Переименование таблицы и jdbc-пул
|
|||
---|---|---|---|
#18+
Спасибо за столь объемный ответ. Версия субд 11.7, csdk не используется - просто jdbc драйвер и пул на сфере. Я бы даже согласился, с багом rename`а, но проблема в том, что тогда получается бага не только у rename`а, а еще и у drop`а. Насколько я понимаю, любая ddl операция над таблицей должна инвалидировать все скомпилированные запросы, в которых эта таблица участвует. У меня складывается ощущение, что проблема в том, что drop detail-таблицы не влияет на валидность плана запроса вставки записи в master, но при исполнении она (detail) все таки затрагивается. Видимо надо каким-то образом выкинуть таки эти скомпилированные запросы из памяти, например "пустым" ddl над master-таблицей, но что-то это все мне уже напонимает шаманство. Проще сервер перегрузить, чем все связи и зависимости вычислять. Вариант с повторным prepare тоже не очень удачный, т.к. пользователи все-таки получат по ошибке на каждую сессию пула. А для чего перезагружать БД? Это уже совсем ни в какие рамки не лезет, чтобы после каждого rename/drop бд перегружать... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 11:08 |
|
Переименование таблицы и jdbc-пул
|
|||
---|---|---|---|
#18+
victor16В любом случае повторный PREPARE помог исправить ситуацию. Кстати, а сервер СУБД не перезапускался? Я бы на вашем месте его бы тоже перезагрузил на всякий случай. "Сервер СУБД" это физический/виртуальный сервер с операционкой ? Зачем его-то ???????? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2016, 21:47 |
|
Переименование таблицы и jdbc-пул
|
|||
---|---|---|---|
#18+
Яковлев Павелvictor16В любом случае повторный PREPARE помог исправить ситуацию. Кстати, а сервер СУБД не перезапускался? Я бы на вашем месте его бы тоже перезагрузил на всякий случай. "Сервер СУБД" это физический/виртуальный сервер с операционкой ? Зачем его-то ? В ранних версиях 11.7 было несколько багов, связанных с повторным PREPARE, особенно в SPL. В качестве workaround техподдержка рекомендует обновиться до актуальной версии, а если это невозможно - rebounce engine. О перезагрузке ОС речи не идет. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2016, 09:14 |
|
|
start [/forum/topic.php?fid=44&tid=1606822]: |
0ms |
get settings: |
18ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
34ms |
get topic data: |
4ms |
get forum data: |
1ms |
get page messages: |
101ms |
get tp. blocked users: |
1ms |
others: | 351ms |
total: | 517ms |
0 / 0 |