Недостаток хранимых процедур

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

20
задан Drew 9 October 2013 в 02:56
поделиться

15 ответов

Исправление: Предварительно ли они компилируются, зависит от базы данных. В SQL Server, например, они не. Хранимые процедуры и параметризованный SQL оба компилируются прежде чем быть выполненным. Хранимая процедура может иногда снова использовать план выполнения, если соответствующий существует..., но параметризованный SQL - также.

Редактирование: Вот то, что MSDN заявляет об этом :

SQL Server 2000 и версия 7.0 SQL Server включают много изменений в обработке оператора, которые расширяют многие выигрыши в производительности хранимых процедур ко всем SQL-операторам. SQL Server 2000 и SQL Server 7.0 не сохраняют частично скомпилированный план относительно хранимых процедур, когда они создаются. Хранимая процедура компилируется во время выполнения, как любой другой оператор Transact-SQL. SQL Server 2000 и SQL Server 7.0 сохраняют планы выполнения относительно всех SQL-операторов в кэше процедур, не только планы выполнения хранимой процедуры.

11
ответ дан 29 November 2019 в 22:27
поделиться

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

1
ответ дан 29 November 2019 в 22:27
поделиться

Преимущества -

  1. Организованный в одном месте (не опрыснутый на всем протяжении кода)
  2. Намного быстрее, чем динамические запросы
0
ответ дан 29 November 2019 в 22:27
поделиться

Преимущество: Ваш связанный с базой данных код, более вероятно, будет написан сотрудниками, которые интересуются и квалифицированы в работе базы данных.

2
ответ дан 29 November 2019 в 22:27
поделиться

Преимущество: DBA может добавить поведение, о котором не заботится приложение. Например, хранение изменить дата на каждой строке.

2
ответ дан 29 November 2019 в 22:27
поделиться

Другой недостаток является управлением версиями, потому что часть бизнес-логики находится теперь в стороне базы данных. Можно ли легко откатывать к v1 (один год назад) от v2 (теперь)?

А выполнимым решением является управление версиями названия хранимой процедуры. Но теперь база данных является путаницей со старыми и новыми хранимыми процедурами.

4
ответ дан 29 November 2019 в 22:27
поделиться

С текущими библиотеками платформы.Net 3.5 я использовал бы Linq для выполнения большинства операций базы данных. Могли бы быть места, где SP имеет больше смысла. Но Linq имеет условия для выполнения SP также.

По теме недостатков SP, проверьте следующую ссылку - интересный анализ. Проверьте комментарии сообщения в блоге также.

http://www.spoiledtechie.com/post/Whats-up-with-Stored-Procedures-these-days.aspx

5
ответ дан 29 November 2019 в 22:27
поделиться

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

Недостаток: Может сделать отладку более сложного. Может также быть чувствительно к тому, чтобы быть отброшенным во время операций копии, если не сделанный правильно.

5
ответ дан 29 November 2019 в 22:27
поделиться

Недостатки

  • Рефакторинг более тверды. Переименование или изменение, где хранимая процедура, могли бы произвести плохой эффект.

  • хранимая процедура Поблочного тестирования требует помощи кода вне Преимущества DB

  • , Вы не должны развертываться для внесения изменения.
  • Быстрее когда-то
  • Легче развернуть систему
7
ответ дан 29 November 2019 в 22:27
поделиться

При помощи SPS Вы также избегаете необходимости предоставлять пользовательский прямой доступ к таблицам. Всем доступом можно управлять через SPS

10
ответ дан 29 November 2019 в 22:27
поделиться

Всего несколько причин я использую хранимые процедуры исключительно при создавании приложений:

  • Хранимые процедуры могут быть интерфейсом между Вашим приложением и базовой базой данных. Таким образом, сервер, на котором находится база данных, который обычно более мощен, чем настольная машина, может использоваться для выполнения более сложных процедур.
  • , Если необходимо изменить структуру базы данных, можно сделать так, не повреждая приложение, если хранимые процедуры используются в качестве интерфейса.
  • , Как Вы пишете, хранимые процедуры содержат предварительно скомпилированный и предварительно протестированный SQL.
  • легче выполнить сложные операции с хранимыми процедурами, чем с SQL, сгенерированным клиентом или GUI.
3
ответ дан 29 November 2019 в 22:27
поделиться

Преимущества: SP используются для выполнения набора операторов sql. Недостатки: сложная отладка

1
ответ дан 29 November 2019 в 22:27
поделиться

Недостатки

  • Управление исходным кодом может быть проблемой.
  • Отладка затруднена .
  • Если у вас много функций в процедурах, это затруднит переключение между различными системами баз данных - это также создает больше работы, если вы хотите поддерживать разные системы баз данных.
  • Разработка хранимых процедур может быть довольно специализированной задачей, особенно по мере того, как они становятся более сложными.
4
ответ дан 29 November 2019 в 22:27
поделиться

Преимущества : Обеспечивает «открытый интерфейс» к базе данных (другой уровень абстракции).

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

Недостатки : Возможно, не лучшее место для размещения сложной логики. Однако, следуя идее, что сложная логика принадлежит коду приложения, а не хранимым процедурам, хранимая процедура становится просто операциями CRUD (каждая таблица имеет процедуры «Создать», «Прочитать», «Обновить» и «Удалить»). В этом случае хранимые процедуры не добавляют ценности приложению, они только усложняют обслуживание и становятся ненужными.

Все запросы сгруппированы вместе, поэтому сложнее увидеть контекст приложения, в котором они используются. Анализировать влияние изменения дольше, как и внесение изменений.

Следовательно : используйте хранимые процедуры для инкапсуляции сложных запросов (сложные соединения, сложные предложения where, ...). Но не используйте хранимые процедуры для сложной логики приложения / домена / бизнеса, а также не используйте хранимые процедуры для CRUD. Таким образом, хранимые процедуры следует использовать в меньшинстве случаев, а не быть стандартным инструментом для всех запросов в приложении.

Группируйте код (включая запросы) для достижения «функциональной согласованности» вместо группировки по инструментам / технологиям. Чтобы администратор баз данных мог оптимизировать базу данных в зависимости от того, как к ней обращаются, используйте профилировщик.

использовать хранимые процедуры для инкапсуляции сложных запросов (сложные соединения, сложные предложения where, ...). Но не используйте хранимые процедуры для сложной логики приложения / домена / бизнеса, а также не используйте хранимые процедуры для CRUD. Таким образом, хранимые процедуры следует использовать в меньшинстве случаев, а не быть стандартным инструментом для всех запросов в приложении.

Группируйте код (включая запросы) для достижения «функциональной согласованности» вместо группировки по инструментам / технологиям. Чтобы администратор баз данных мог оптимизировать базу данных в зависимости от того, как к ней обращаются, используйте профилировщик.

использовать хранимые процедуры для инкапсуляции сложных запросов (сложные соединения, сложные предложения where, ...). Но не используйте хранимые процедуры для сложной логики приложения / домена / бизнеса, а также не используйте хранимые процедуры для CRUD. Таким образом, хранимые процедуры следует использовать в меньшинстве случаев, а не быть стандартным инструментом для всех запросов в приложении.

Группируйте код (включая запросы) для достижения «функциональной согласованности» вместо группировки по инструментам / технологиям. Чтобы администратор баз данных мог оптимизировать базу данных в зависимости от того, как к ней обращаются, используйте профилировщик.

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

Группируйте код (включая запросы) для достижения «функциональной согласованности» вместо группировки по инструментам / технологиям. Чтобы администратор баз данных мог оптимизировать базу данных в зависимости от того, как к ней обращаются, используйте профилировщик.

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

Группируйте код (включая запросы) для достижения «функциональной согласованности» вместо группировки по инструментам / технологиям. Чтобы администратор баз данных мог оптимизировать базу данных в зависимости от того, как к ней обращаются, используйте профилировщик.

35
ответ дан 29 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: