Должны ли мы отбросить хранимые процедуры и запускать вызовы базы данных из Java-программ

Я борюсь за использование хранимых процедур в нашей компании. Некоторые люди говорят, что они плохие, и мы не должны их использовать. Мы используем DB2 в i-серии.

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


person Doug    schedule 06.04.2010    source источник
comment
Если возможно, вы можете опубликовать свои аргументы, и какой из них они (несколько человек) отрицают? и как?   -  person Gopi    schedule 06.04.2010
comment
Я тоже могу придумать ряд аргументов против этого, но я полагаю, что они вам неинтересны ...? ;)   -  person falstro    schedule 06.04.2010
comment
Да, мне интересны обе стороны. Если ошибаюсь, они должны уйти.   -  person Doug    schedule 06.04.2010
comment
Я считаю, что они уменьшают сетевой трафик с уменьшенной длиной строк, они компилируются в код C, который будет работать быстрее, чем код, переведенный на java. Операторы предварительно разбиваются (анализируются) в хранимой процедуре, пути доступа уже сохранены с процедурой.   -  person Doug    schedule 06.04.2010
comment
Все аргументы кажутся либо исключительно ИП, либо вообще отсутствием ИП. И если это предполагаемый контраст для дебатов, то это больше сводится к нормативным требованиям или требованиям безопасности. Если удаленные запросы запрещены, выбор невелик; SP - это почти все, что есть для удаленного доступа к БД. Но если контраст заключается в использовании ИП там, где это уместно, и в отсутствии ИП, и ваши коллеги спорят о том, чтобы отказаться от ИП, тогда вашим коллегам нужно вернуться в школу. Вопрос следует прояснить.   -  person user2338816    schedule 24.03.2014
comment
Отвечает ли это на ваш вопрос? Является ли использование хранимых процедур плохой практикой?   -  person tripleee    schedule 10.12.2019


Ответы (6)


ОК, я выйду в пользу сохраненных процедур.

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

Во-вторых, если вам нужно изменить только запрос, их гораздо проще развернуть.

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

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

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

ORM также имеют тенденцию писать совершенно плохой код SQL, особенно если запрос сложный. Кроме того, когда люди начали использовать их вместо хранимых процедур, я обнаружил, что люди, которые никогда не использовали хранимые процедуры, хуже понимают, как получить данные из базы данных, и часто получают неправильные данные. Использование ORM нормально, если вы уже разбираетесь в SQL и можете определить, когда переписать автоматически сгенерированный код во что-то, что работает лучше. Но у слишком многих пользователей нет навыков для написания сложного кода, потому что они никогда не изучали основ.

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

person HLGEM    schedule 06.04.2010

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

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

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

Если вы хотите получить более подробную информацию об аргументах в пользу отказа от хранимых инструкций, ознакомьтесь с этой статьей CodingHorror:

Ужас программирования: кому все равно нужны хранимые процедуры?

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

person Justin Niessner    schedule 06.04.2010
comment
+1 - полностью согласен. SP - это заблуждение, которое мешает любой приличной попытке правильно спроектировать приложение. Они могут быть полезны в определенных обстоятельствах (например, бизнес-логика, предполагающая массовое перемещение данных), но никогда не должны быть самим бизнес-уровнем. - person Otávio Décio; 06.04.2010
comment
+1, не говоря уже о версиях, логистике, скользящих обновлениях, работе с несколькими базами данных. Большинство этих проблем решалось снова и снова, но все еще сложно найти ту, которая будет работать с хранимыми процедурами. - person falstro; 06.04.2010
comment
Что-то подразумевается, но не прописано здесь: хранимые процедуры в основном помещают приложение в базу данных. - person matt b; 06.04.2010
comment
@mattb - ты так говоришь, как будто это плохо. - person APC; 06.04.2010
comment
@APC, для некоторых это так. Поэтому, если это плохо для вас, вы, вероятно, находитесь на плохой стороне хранимых процедур. - person matt b; 06.04.2010
comment
Я думаю, что одно место, которое мы можем упускать из виду, - если у вас есть устаревшая модель данных, использование хранимых процедур в качестве уровня защиты от коррупции может сделать вещи намного проще и чище. - person jayshao; 06.04.2010
comment
Хранимые процедуры, особенно на IBM i, - очень мощная вещь - по сути, они обеспечивают доступ ко всей машине целиком. Другими словами, когда это AS / 400, все другое. Те, кто говорит, зная только Oracle, SQL Server или аналогичные, откровенно не понимают, о чем они говорят. - person Thorbjørn Ravn Andersen; 06.04.2010
comment
@ Thorbjørn Почему доступ ко всей машине целиком - это хорошо для iSeries? (я никогда не работал с iSeries, мне любопытно, что вы получите от обычных запросов через JDBC)? - person Justin Niessner; 06.04.2010
comment
@Justin, обычно вы ограничены тем, что вам предоставляет поставщик базы данных, как с точки зрения языков, так и с точки зрения возможностей. В AS / 400 база данных является интегрированной частью операционной системы, поэтому каждая программа на компьютере может (при наличии достаточных разрешений) работать напрямую с любой таблицей на уровне записи на полной скорости. Это очень мощная концепция, позволяющая выбрать лучший язык программирования для любой задачи. - person Thorbjørn Ravn Andersen; 06.04.2010
comment
@ Thorbjørn Но это все еще не касается того факта, что вы работаете с СУБД с двумя разными базами кода, которые нужно поддерживать (ваше приложение и любые хранимые процедуры, которые вы написали на других языках / местах), возможно, используются разные языки и логика вашего приложения разбросана по всему приложению. Действительно ли прирост производительности SP по сравнению с JDBC перевешивает недостатки? - person Justin Niessner; 06.04.2010
comment
@Justin, вы можете легко справиться с единой исходной базой, сохранив исходный код для ваших хранимых процедур в своем проекте приложения и использовать его для развертывания кода в базе данных. Кроме того, если вы используете SQL для управления базой данных, вы УЖЕ используете дополнительный язык. - person Thorbjørn Ravn Andersen; 06.04.2010
comment
Фундаментальным элементом параметризованных запросов является просто разрешение удаленных запросов. Для любого потенциального количества таблиц, приложений или баз данных это может быть просто запрещено (потенциально открывая юридическую ответственность). Система, которая разрешает параметризованные запросы, должна сначала разрешить запросы. Обратите внимание, что не весь доступ к базе данных осуществляется через веб-сервер или через развернутые приложения. Ограничение доступа через SP может действовать через каждую точку входа; даже программист, знающий JDBC / и т. д. кодирование обходится без них после того, как установлены ограничения полномочий. - person user2338816; 30.03.2014

Выполнение всего через JDBC по сути означает, что вы вставляете сетевой уровень между вами и базой данных. В целом это означает, что данные более «удаленные» и медленнее приходят к вам. Хранимые процедуры могут работать непосредственно с данными внутри базы данных, и результирующая разница в скорости может вас удивить.

Обратите внимание, что вы можете писать хранимые процедуры на любом языке IBM i, включая Java, если это зависит от навыков программирования. Кроме того, у вас есть доступ к ПОЛНОЙ машине, а не только к некоторым внутренним компонентам базы данных. Здесь AS / 400 настолько сильно отличается от любого другого продукта баз данных, что опыт других баз данных просто - по моему мнению - неприменим.

Я бы порекомендовал списки рассылки Midrange, так как они обладают наибольшей концентрацией навыков программирования AS / 400, о которых я знаю.

person Thorbjørn Ravn Andersen    schedule 06.04.2010
comment
Разве операторы не разбиты на отдельные части, чтобы этот шаг не выполнялся каждый раз. - person Doug; 06.04.2010
comment
@ Дуг, я не понимаю, о чем ты спрашиваешь. - person Thorbjørn Ravn Andersen; 06.04.2010

Это одна из проблем Marmite. Если вы в первую очередь программист баз данных, вы подумаете, что хранимые процедуры следует использовать широко. Если вы программист приложений - скажем, программист на Java или .Net - скорее всего, вы скажете, что их следует полностью избегать.

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

Есть два важных момента в пользу хранимых процедур. Во-первых, люди, которые знают PL / SQL, вероятно, знакомы с базами данных Oracle (T-SQL, SQL Server и т. Д.), И поэтому будут стремиться писать лучшие программы для этой базы данных (определяемые как программы, которые используют преимущества платформы функции и соответствуют его функциональности), чем люди, которые этого не делают.

Во-вторых, данные сохраняются. Разработчики приложений любят говорить о «независимости базы данных», но что действительно важно, так это независимость приложения. Внешние интерфейсы приходят и уходят, но модель данных существует вечно. За последние десять лет Java-приложения были написаны в виде апплетов, сервлетов, JSP, плиток и граней с надстройками на JavaScript, Groovy, AJAX и JSON, подключающимися к базе данных через вручную свернутый JDBC, EJB (v1,2, 3), TopLink, Hibernate и IBatis ... простите, если я пропустил несколько. Приложения, пользовательский интерфейс которых представляет собой оболочку над слоем хранимых процедур, легче обновить до последней и лучшей версии, чем приложения, в которых бизнес-логику приходится каждый раз переписывать. И они тоже будут работать лучше.

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

person Community    schedule 06.04.2010

Они полезны, когда у вас многоуровневый набор приложений. Например, одноядерная БД с веб-службами, предлагающими атомарные операции (которые оказываются хранимыми процедурами), и ESB или набор приложений, использующих эти WS. В случае с одним приложением / одним БД идея состоит в том, чтобы хранить код в одном месте, как предлагали другие.

Но что ж, это только я.

person Alfabravo    schedule 06.04.2010

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

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

Я предпочитаю избегать каких-либо хранимых процедур для простых операций CRUD (для некоторых это может показаться смешным, если хранимые процедуры обрабатывают эти операции, но я встречал несколько систем, которые делали это). кода, который должен быть написан (и протестирован и поддержан) на стороне Java для управления этими вызовами процедур, из того, что я наблюдал. Лучше просто использовать Hibernate (или какую-либо другую библиотеку ORM) для обработки таких операций ... если только по той причине, что это имеет тенденцию уменьшать объем кода, который необходимо поддерживать. Это также может вызвать проблемы при попытке рефакторинга или внесения каких-либо существенных изменений в систему, поскольку вам нужно не только заботиться об изменениях классов / таблиц, но и хранить хранимые процедуры, которые также обрабатывают операции CRUD. И это может усугубиться еще больше, если вы находитесь в ситуации, когда разработчики не могут вносить изменения в базу данных сами, или существует какой-то формальный процесс для координации изменений между двумя частями системы.

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

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

person BCunningham    schedule 06.04.2010