Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП / ООП / ры_приложений_полная_книга.pdf
Скачиваний:
528
Добавлен:
18.02.2017
Размер:
7.08 Mб
Скачать

При использовании аутентификации SQL применяйте учетные записи с надежными паролями; с помощью ролей базы данных ограничьте права доступа каждой учетной записи в рамках SQL Server; добавьте ACL во все файлы, используемые для хранения строк подключения; и шифруйте строки подключения в конфигурационных файлах.

Используйте учетные записи с наименьшими правами доступа к базе данных и требуйте от вызывающей стороны предоставлять слою данных идентификационные данные для целей аудита.

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

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

Защитите конфиденциальные данные, передаваемые по сети к и от SQL Server. Не забывайте, что аутентификация Windows обеспечивает защиту учетных данных, но не данных приложения. Для защиты данных в канале передачи используйте протоколы IPSec или SSL.

Пул подключений

Пул подключений обеспечивает возможность повторного использования приложением подключения из пула или создания нового подключения и добавления его в пул в случае недоступности подходящего подключения. Когда приложение закрывает подключение, оно возвращается в пул, и базовое подключение остается открытым. Это означает, что ADO.NET не надо создавать новое подключение к источнику данных, и каждый раз открывать его заново. Хотя использование пула открытых подключений потребляет ресурсы, это обеспечивает сокращение задержек при доступе к данным и повышает эффективность выполнения приложения в случае доступности подходящих соединений из пула. Рассмотрим другие вопросы использования пула подключений:

Чтобы максимально повысить эффективность пула подключений, используйте модель безопасности доверенная подсистема и по возможности избегайте олицетворения. Использование минимального числа учетных записей повышает вероятность повторного использования подключения из пула и сокращает шансы переполнения пула подключений. Если каждый вызов использует разные учетные данные, ADO.NET приходится каждый раз создавать новое подключение.

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

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

Транзакции и параллелизм

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

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

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

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

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

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

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

Существует три общих типа поддержки транзакций:

Классы пространства имен System.Transactions обеспечивают поддержку явных и неявных транзакций как часть .NET Framework. Используйте System.Transactions при разработке нового приложения, требующего поддержку транзакций, или при наличии транзакций, охватывающих несколько диспетчеров недолгосрочных ресурсов. Для реализации большинства транзакций рекомендуется использовать явную модель, которую обеспечивает объект TransactionScope пространства имен System.Transactions. Хотя неявные транзакции не настолько быстрые, как созданные вручную, или явные, но их проще создавать, и они обеспечивают решения промежуточного уровня, гибкие и более простые в обслуживании. Если не желаете использовать неявную модель для транзакций, можно реализовать создание транзакций вручную, используя класс Transaction пространства имен

System.Transactions.

Транзакции ADO.NET, использующие единственное подключение к базе данных. Это наиболее эффективный подход для управляемых клиентом транзакций с одним хранилищем данных. Выбирайте транзакции ADO.NET, если расширяете приложение, уже использующее транзакции ADO.NET; если используете поставщиков ADO.NET для доступа к базе данных и транзакции выполняются только к одной базе данных; или если развертываете приложение в среде, не поддерживающей версию 2.0 .NET Framework. Команды ADO.NET обеспечивают начало, фиксацию и откат операций, осуществляемых в рамках транзакции.

Транзакции T-SQL (базы данных), управляемые командами, выполняемыми в базе данных. Это наиболее эффективный способ реализации управляемых сервером транзакций с одним хранилищем данных, при котором база данных контролирует все аспекты транзакции. Используйте транзакции базы данных при разработке хранимых процедур, инкапсулирующих все изменения, которые должны быть выполнены транзакцией, или при наличии множества приложений, использующих одни и те же хранимые процедуры, когда требования транзакции могут быть инкапсулированы в хранимые процедуры.

Соседние файлы в папке ООП