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

StackOverflow https://stackoverflow.com/questions/2585184

Вопрос

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

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

Это было полезно?

Решение

Хорошо, я выйду в пользу хранимых процессов.

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

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

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

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

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

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

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

Другие советы

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

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

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

Если вы хотите более подробную информацию о аргументах для перехода от хранящихся PRCOREDURE, проверьте эту статью Codinghorror:

Кодирование ужасов: кому нужно хранить процедуры?

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

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

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

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

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

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

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

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

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

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

Но хорошо, это только я.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top