Каковы наилучшие методы переноса базы данных Oracle 10g на Microsoft SQL 2008 R2? Приложение использует гибернацию

#java #sql-server #oracle #hibernate #migration

#java #sql-server #Oracle #режим гибернации #миграция

Вопрос:

В основном то, что написано в названии. В дальнейшем нам нужно начать поддерживать обе платформы баз данных (и соответственно начать писать миграции), но нам нужно выполнить первый начальный «перенос».

Наши администраторы баз данных уверены, что смогут преобразовать схему, таблицы, типы данных и т.д. Но у наших разработчиков меньше уверенности в том, что DAO будут «просто работать». Может ли кто-нибудь указать нам на некоторые ресурсы, которые мы можем просмотреть? В идеале следует избегать распространенных ошибок, запускать специальные тесты и т.д. Мы, конечно, запустим полный набор тестов базы данных на прикладном уровне, но перед этим хотим провести как можно большую подготовку.

Ответ №1:

Обратите внимание и протестируйте производительность под нагрузкой. Oracle делает некоторые вещи принципиально иначе, чем другие поставщики баз данных. В превосходной книге Тома Кайта «Эксперт по архитектуре баз данных Oracle» указывается на несколько отличий. Пара основных моментов:

  1. Oracle никогда не блокирует данные только для их чтения. Многие другие базы данных используют.
  2. Программа записи данных в Oracle никогда не блокирует программу чтения. Считыватель данных никогда не блокирует запись. Опять же, многие другие поставщики используют.

Не обращать внимания на подобные вещи может вызвать большие головные боли после преобразования, когда возникают проблемы с блокировкой. Это не означает превосходства одного продукта над другим, скорее это просто означает, что то, что хорошо работает с продуктом одного поставщика, может с треском провалиться в другом, и могут потребоваться индивидуальные подходы, зависящие от базы данных.

Комментарии:

1. Если вы переходите на SQL Server 2008 R2 (или что-либо еще начиная с 2005 года), спросите своих администраторов баз данных, возможно ли настроить ваши базы данных с использованием изоляции моментальных снимков с фиксацией чтения. Есть некоторые оговорки к этому, о которых, надеюсь, будут знать ваши администраторы баз данных. Но если это возможно, оно обеспечит тот же уровень изоляции транзакций, что и Oracle, чтобы операции чтения и обновления не блокировали друг друга.

Ответ №2:

То же самое (хотя, должен сказать, по довольно простой схеме). «Просто сработало». Магия гибернации.

Я был спокоен, потому что у нас было 100% тестовое покрытие для DAO layer. Итак, когда схема была воссоздана в MS SQL, и некоторые имена таблиц и столбцов были обновлены в сопоставлении (не помню почему, но администраторы баз данных попросили, возможно, это соглашение об именовании), мы просто запустили наши тесты и не обнаружили сбоев.

P.S. Вспомнил одну интересную деталь: все функциональные тесты прошли нормально. Но когда PTE запустился в базе данных MS SQL, мы обнаружили, что одновременный доступ к одной конкретной таблице был в разы медленнее, чем в Oracle, из-за распространения блокировок. Нам пришлось перепроектировать эту функциональность.

Ответ №3:

Я думаю, первым шагом было бы получить пустую схему MS SQL, использовать hbm2ddl=true и позволить Hibernate создавать там таблицы. Затем покажите это своим администраторам баз данных и спросите, имеет ли это смысл.

Заполнение данных — это меньшая проблема, я бы предположил, что запросы будут более скользкими (особенно если вы используете необработанный JDBC в некоторых местах). Возможно, вам также захочется проверить планы запросов для часто используемых запросов и посмотреть, имеют ли они смысл тоже.

Комментарии:

1. Спасибо, но как насчет хранимых процедур? Существует довольно много используемых по соображениям производительности (например, для вычисления / хранения огромных наборов данных без необходимости чтения в память на уровне DAO). Я бы предположил, что их нужно будет каким-то образом преобразовать из синтаксиса Oracle в MSSQL?

2. Я предполагаю, что их придется переписать и полностью протестировать повторно. Я не думаю, что Hibernate предлагает какую-либо помощь здесь, вам придется делать это вручную.