Спящий режим или JDBC


У меня есть толстый клиент, java swing-приложение со схемой из 25 таблиц и ~15 JInternalFrames (формы ввода данных для таблиц). Мне нужно сделать выбор дизайна прямого JDBC или ORM (hibernate с spring framework в этом случае) для взаимодействия с СУБД. Строить из приложения будет происходить в будущем.

будет ли спящий режим излишним для проекта такого размера? Объяснение либо да, либо нет ответа будет высоко оценено (или даже другой подход если это оправдано).

ТИА.

9 65

9 ответов:

хороший вопрос без единого простого ответа.

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

сегодня я не так уверен.

Hibernate (и JPA) отлично подходит для некоторых вещей, особенно в начале цикла разработки. Гораздо быстрее добраться до чего-то, работающего с Hibernate, чем с JDBC. Вы получаете много возможностей бесплатно - кэширование, оптимистичная блокировка и так далее.

с другой стороны, она имеет некоторые скрытые расходы. Hibernate обманчиво просто, когда вы начинаете. Следуйте какой - то учебник, поставить некоторые аннотации на вашем классе-и у вас есть себе настойчивость. Но это не просто, и чтобы иметь возможность писать хороший код в нем требует хорошего понимания как его внутренней работы, так и дизайна базы данных. Если вы только начинаете, вы можете не знать о некоторых проблемах, которые могут укусить вас позже, так что здесь это неполный список.

производительность

производительность во время выполнения достаточно хороша, я еще не видел ситуации, когда hibernate был причиной низкой производительности в производства. Проблема заключается в производительности запуска и как это влияет на время модульных тестов и производительность разработки. При загрузке hibernate он анализирует все объекты и делает много предварительного кэширования-это может занять около 5-10-15 секунд для не очень большого приложения. Так ваш 1 второй модульный тест теперь займет 11 секунд. Не весело.

Независимость Базы Данных

Это очень здорово, пока вам не нужно делать некоторые тонкие настройки в базе данных.

сеанс в памяти

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

Каскад

каскады позволяют упростить работу с графами объектов. Например, если у вас есть корневой объект и некоторые дочерние объекты, и вы сохраняете корневой объект, вы можете настроить hibernate для сохранения дочерних объектов. Проблема начинается, когда ваш граф объектов становится сложным. Если вы не очень осторожны и не имеете хорошее понимание того, что происходит внутри, это легко испортить. И когда вы это делаете, очень трудно отладить эти проблемы.

Загрузка

ленивая загрузка означает, что каждый раз, когда вы загружаете объект, hibernate не будет загружать все связанные с ним объекты, а вместо этого предоставит держатели мест, которые будут разрешены, как только вы попытаетесь получить к ним доступ. Отличная оптимизация? Это так, за исключением того, что вам нужно знать об этом поведении, иначе вы получите загадочные ошибки. Google "LazyInitializationException" для примера. И будьте осторожны с производительностью. В зависимости от того, как вы загружаете свои объекты и свой график объектов, вы можете нажать "n+1 выбирает проблему". В Google для получения дополнительной информации.

Обновлений Схемы

Hibernate позволяет легко изменять схему, просто рефакторинг кода java и перезапуск. Это здорово, когда вы начинаете. Но затем вы выпускаете версию один. И если вы не хотите потерять своих клиентов вам нужно предоставить им сценарии обновления схемы. Это означает, что нет более простого рефакторинга, поскольку все изменения схемы должны быть сделаны в SQL.

представления и хранимые процедуры

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

Однопоточные Сеансы

сеансы гибернации являются однопоточными. Любой объект, загруженный через сеанс, может быть доступен только (включая чтение) из того же потока. Это приемлемо для приложений на стороне сервера, но может усложнить ненужные вещи, если вы делаете приложение на основе графического интерфейса.

Я думаю, моя точка зрения заключается в том, что нет бесплатного питания.

Hibernate-хороший инструмент, но это сложный инструмент, и для его правильного понимания требуется время. Если у вас или членов вашей команды нет таких знаний, может быть проще и быстрее использовать чистый JDBC (или Spring JDBC) для одного приложения. С другой стороны, если вы готовы инвестировать время в обучение (включая обучение на практике и отладки), чем в будущем вы сможете понять компромиссы лучше.

Hibernate может быть хорошим, но он и другие JPA ORMs, как правило, диктуют структуру вашей базы данных в определенной степени. Например, составные первичные ключи можно сделать в Hibernate / JPA, но они немного неудобны. Есть и другие примеры.

Если вам удобно с SQL, я настоятельно рекомендую вам взглянуть на Ibatis. Он может сделать 90%+ того, что может Hibernate, но гораздо проще в реализации.

Я не могу придумать ни одной причины, почему я когда-либо выбирал прямой JDBC (или даже Spring JDBC) над Ibatis. Hibernate-это более сложный выбор.

посмотри весна и Ibatis учебник.

без сомнения, Hibernate имеет свою сложность.

но что мне действительно нравится в подходе Hibernate (некоторые другие тоже), так это концептуальная модель, которую вы можете получить в Java лучше. Хотя я не думаю о OO как о панацее, и я не ищу теоретическую чистоту дизайна, я нашел так много раз, что OO действительно упрощает мой код. Как вы просили специально для деталей, вот несколько примеров:

  • the добавленная сложность не в том модель и сущности, но в вашей структуре для управления всеми сущностями, например. Для сопровождающих трудная часть-это не несколько классов фреймворка, а ваша модель, поэтому Hibernate позволяет вам сохранить жесткую часть (модель) на самом чистом месте.

  • Если поле (например, id или поля аудита и т. д.) используется во всех ваших сущностях, вы можете создать суперкласса С ним. Таким образом :

    • вы пишете меньше кода, но, что более важно ...
    • в вашей модели меньше понятий (уникальная концепция уникальна в коде)
    • бесплатно вы можете написать код более общий, который предоставляется с сущностью (неизвестно, без переключения типа или приведения), позволяет получить доступ к идентификатору.
  • Hibernate также имеет множество функций для работы с другими характеристиками модели, которые вам могут понадобиться (сейчас или позже, добавьте их только по мере необходимости). Возьмите его как расширения качество дизайн.

    • вы можете заменить наследование (подклассы) композицией (несколько сущностей, имеющих один и тот же элемент, который содержит несколько связанных полей, которые необходимы в нескольких сущностях).
    • может быть наследование между несколькими из ваших сущностей. Часто бывает, что у вас есть две таблицы, которые имеют почти одинаковую структуру (но вы не хотите хранить все данные в одной таблице, потому что вы потеряете ссылочную целостность к другому родителю таблица.)
  • с повторным использованием между вашими сущностями (но только соответствующее наследство и состав), как правило, есть некоторые дополнительные преимущества, чтобы прийти. Примеры:

    • часто существует какой-то способ чтения данных сущностей, которые похожи, но отличаются. Предположим, я прочитал поле "title" для трех сущностей, но для некоторых я заменяю результат другим значением по умолчанию, если оно равно null. Это легко имейте подпись "getActualTitle" (в суперклассе или интерфейсе) и реализуйте обработку значений по умолчанию в трех реализациях. Это означает, что код из моих сущностей просто имеет дело с концепцией "фактического названия" (я сделал эту функциональную концепцию явной), а наследование метода заботится о выполнении правильного кода (больше не переключается или если нет дублирования кода).
    • ...
  • со временем требования эволюционируют. Там будет момент, когда ваша структура базы данных имеет проблемы. Только с JDBC любое изменение базы данных должно влиять на код (т. е. двойная стоимость). С помощью Hibernate многие изменения могут быть поглощены изменением только отображения, а не кода. То же самое происходит и наоборот : Hibernate позволяет изменять код (например, между версиями) без изменения базы данных (изменение сопоставления, хотя этого не всегда достаточно). Подводя итог, Hibernate позволяет развивать вашу базу данных и ваш код независимо.

по всем этим причинам я бы выбрал Hibernate : -)

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

где Hibernate действительно светит для меня имеет дело с отношениями между сущностями / таблицами. Выполнение JDBC вручную может занять много кода, если вы имеете дело с изменением родителя и детей (внуков, братьев и сестер и т. д.) Одновременно. Hibernate может сделать это ветерок (часто одно сохранение родительского объекта достаточно.)

конечно, есть сложности при работе с Hibernate, например, понимание того, как работает промывка сеанса, и работа с ленивой загрузкой.

прямой JDBC будет соответствовать самым простым случаям в лучшем случае.

Если вы хотите остаться в Java и OOD, то переход в спящий режим или Hibernate/JPA или любой другой-JPA-провайдер/JPA должен быть вашим выбором.

Если вам удобнее с SQL, то наличие Spring для шаблонов JDBC и других SQL-ориентированных фреймворков не повредит.

напротив, помимо транзакционного контроля, нет большой помощи от наличия пружины при работе с JPA.

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

  1. в JDBC, если мы открываем соединение с базой данных, нам нужно написать в try, и если какие-либо исключения произошли, блок catch будет принимать об этом и, наконец, используется для закрытия соединений.

  2. в jdbc все исключения являются проверенными исключениями, поэтому мы должны писать код в try, catch и throws, но в hibernate у нас есть только непроверенные исключения

  3. здесь как программист мы должны закрыть соединение, или мы можем получить шанс получить наши сообщения о соединениях...!

  4. На самом деле, если мы не закрыли соединение в блоке finally, то jdbc не несет ответственности за закрытие этого соединения.

  5. в JDBC нам нужно писать команды Sql в разных местах, после того, как программа создала, если структура таблицы изменена, то программа JDBC не работает, снова нам нужно изменить и скомпилировать и повторно развернуть, что утомительно.

  6. JDBC используется для генерируйте коды ошибок, связанные с базой данных, если произойдет исключение, но Java-программисты не знают об этих кодах ошибок правильно.

  7. в то время как мы вставляем любую запись, если у нас нет какой-либо конкретной таблицы в базе данных, JDBC поднимает ошибку типа "View not exist" и выдает исключение, но в случае спящего режима, если он не нашел никакой таблицы в базе данных, это создаст таблицу для нас

  8. JDBC поддерживает ленивую загрузку и спящий режим поддерживает нетерпеливую загрузку

  9. Hibernate поддерживает наследование, Ассоциации, фонды

  10. в hibernate если мы сохраняем объект производного класса, то его объект базового класса также будет храниться в базе данных, это означает, что hibernate поддерживает наследование

  11. Hibernate поддерживает отношения,такие как один-ко-многим, один-к-одному, многие-ко - многим, многие-к-одному

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

  13. получение пагинации в спящем режиме довольно просто.

  14. Hibernate имеет возможность автоматически генерировать первичные ключи во время хранения записей в базе данных

... Сеанс в памяти ... LazyInitializationException ...

вы можете посмотреть на Ebean ORM который не использует объекты сеанса ... и где ленивая загрузка просто работает. Конечно вариант, не перебор, и разобраться будет проще.

Если миллиарды пользователей используют приложение или веб, то в запросе jdbc будут выполняться миллиарды раз, но в запросе hibernate будет выполняться только один раз для любого количества пользователей самое важное и простое преимущество hibernate над jdbc.