ASP NET, NET Framework, MONO, SQL, Visual Studio | Professional Programs | Программист Еремин В.В.
(MONO) MONO (2009 год)

Используем PostgreSQL вместо MS SQL в проектах на NET и ASP.NET

http://www.postgresql.org/

Общую мотивацию, почему не следует заниматься самокастрацией, применяя микрософтовские продукты для ASP.NET я приводил здесь Осторожно Microsoft, Low Cost ASP.NET, Используем MySQL вместо MS SQL в проектах на ASP.NET. Повторяться не будем. Если вам действительно хочется делать ASP.NET сайты, работающие на любой платформе, и не кормить при этом шайку Билла Гейтса - добро пожаловать в самую мощную в мире СУБД с открытым исходным кодом - PostgreSQL.

На PostgreSQL работает Skype, Yahoo, Mail.ru, NASA (перечень организаций). Компания SUN утверждает, что PostgreSQL работает быстрее Оракла (не говоря уже о MS SQL). Для ПГ существует множество дополнений и расширений, множество специализированных организаций, проводящих тестирование знаний и выдающих сертификаты, большое международное сообщество, проводящее регулярные встречи и ведущее развитие PostgreSQL по основным 400 направлениям-проектам, есть и русскоязычное сообщество.

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

Начать теоретическое знакомство с PostgreSQL можно с wikipedia.org, посмотреть русский сайт http://postgresql.ru.net/manual/index.html (original manual) и официальный сайт postgresql.org. А практическое знакомство вы можете начать с LiveCD. Для людей, травмированных виндузней диковато звучит, что можно просто взять флешку, загрузиться с нее и получить вполне полноценную рабочую среду. Эту технологию я описал здесь - Загрузочные компакты и флешки (bootable LiveCD and bootable USB). Так вот, существует множество флешек, с которых вы просто можете загрузиться и получить полностью функциональную среду PostgreSQL, например Turnkey Linux. Хотя PostgreSQL развивается настолько быстро, что люди не успевают делать и выкладывать загрузочные флешки со свежим версиям этой СУБД.


После первоначального знакомства попробуйте скачать PostgreSQL поставить ее себе на компьютер. Качать можно с сайта http://www.postgresql.org/download/, с русского зеркала http://postgresql.ru.net/download.html или с сайта http://www.enterprisedb.com/products/postgresql.do. Я убедился что в репозитариях Linux не всегда уложен PostgreSQL с правильными настройками безопасности каталогов и всеми конфигурационными файликами, позволяющими сразу начать работать. Поэтому я бы порекомендовал качать с EnterpriseDB - на мой взгляд наиболее качественно подготовленные инсталяции лежат именно там.

Документацию для Win-платформы можете взять с моего сайта - postgresql-8.4.chm и хорошую общую книжечку на 2000 страничек тоже можете взять у меня - postgresql-8.4.3-A4.pdf


C сайта http://www.enterprisedb.com/ вы можете скачивать голый PostgreSQL, а можете Postgres Plus Standard Server. Он тоже бесплатный (как и сам PostgreSQL). Он распространяется как и любой линукс - с оплатой только техподдержки. В пакете Standart Server есть целая куча полезняшек - например менеждер репликации Slony, pcbouncer - менеджер пулов коннектов и многие другие штучки. Из обязательного софта для программирования в NET/MONO - надо уставить этим же визардом драйвер Npgsql.

Оплата для PostgreSQL и Postgres Plus Standard Server не требуется - только регистрация. Она нужна только для Postgres Plus Advanced Server (который совместим с Oracle).

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


Win-установка тривиальная как отдельно PasrgreSQL, так и пакета EnterpriseDB (везде просто нажимаете ОК), но при инсталяции замечены множественные глюки. Основной блок глюков связан с правами, инсталяция запускается обычно из-под админа, а сервис СУБД запускается уже из-под специальной учетки Postgres. У этой учетки не хватает прав на директорию DATA, где лежит база и конфигурация. Когда такая неудачная инсталляция завершается - директория с базой пустая. Тогда вы вручную ставите на эту директорию права, удаляете инсталлированную версию (при этом каталог DATA останется) и прогоняете инсталяцию снова. При втором прогоне прав хватает и база и конфиги создаются.

Полезно также добавить директорию BIN в переменную PATH окружения Windows. Новые версии PostgreSQL с исправленными ошибками выходят быстрее, чем EnterpriseDB готовит пакеты, поэтому я несколько раз накатывал поверх пакетов EnterpriseDB более новые версии движка СУБД.

В Application Stack Builder (менеждере компонентов PostgreSQL, распространяемом EnterpriseDB) вы можете выбрать множество полезного дополнительного софта, например Database Tuning Wizard. При скачке дополнительного софта вас попросят ввести свое мыло. Application Stack Builder обычно висит в трее и уведомляет вас о появляющихся обновляшках Postgres.


Вам нужно скачать любое средство программирования и управления этой СУБД (которых существует десятки). Я выбрал pgAdmin, который можно скачать отсюда - pgadmin.org. Если вы скачивали готовый пакет у EnterpriseDB, в нем уже есть pgAdmin.

Если инсталяция пройдет нормально, то сможете насладится управлением самой мощной СУБД в мире.


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

В PostgreSQL полностью отсутствует управление занимаемыми ресурсами кампутера. Это неплохо для выделенного сервера с PostgreSQL - поставил процессор в 100%, загрузил на 100% производительность дисковой подсистемы - и никакой MS SQL или Oracle тебя не догонит. Но а если это многопользовательский кампутер, на котором например еще работает IIS или Apache? Надо же им гарантированно оставить хотя бы 10 процентов общей производительности системы?

В плане ограничения скорости работы PostgreSQL мне представляется удачной комбинация PostgreSQL и лучшего из менеджера ресурсов что я видел - VmWare. Это на три головы превосходит MS SQL Resource Governor и к тому же WmWare ESXI тоже полностью бесплатна.


Администрирование СУБД очень простое. Сервис СУБД запускается как Windows-служба или просто из командной строки. В качестве основного рабочего параметра сервиса СуБД указывается каталог на диске. В этом каталоге находятся несколько конфигурационных файлов PostgreSQL и файлик postmaster.pid, который контроллирует чтобы по этому же каталогу не запустился второй экземпляр СУБД. В конфигурационном файлике pg_hba.conf указывается откуда можно коннектится к сервису, в postgresql.conf указываются все основные настройки, включая порт. Если вы поставите средство администрирвоания СУБД, например PgAdmin, то вручную можно не править конфиги, в PgAdmin есть средства для настройки конфигурации (к тому же они создают бекапы конфигрурации).

При установке из пакета EnterpriseDB у вас будет в меню старт/стоп сервиса ПГ, для перезагрузки конфигурации вы можете дать просто команду select pg_reload_conf(); Вообще управление сервисом постгреса осуществляется из командной строки прораммой /BIN/pg_ctl.exe. В нее вам придется подробнее погрузится, если в вашей виндузовой среде сервис не стартует (в линуксе такого не было замечено). Перед первым запуском PostgreSQL нужно создать первого юзера и разрешить коннекты с базе с локальной машины (это только в Linux - в виндузне инсталятор EnterpriseDB это создаст сам).

В PostgreSQL нет отдельной программы Profiler. Здесь просто в конфигурации ставится параметр log_min_duration_statement=0 и сервер пишет журнал обработанных команд в виде тестового файлика.


Если вы мигрируете с MS SQL, вы вероятно привыкли работать с заданиями SqlJob (которые кстати MS категорически отказывается включать в бесплатный пакет MS SQL). Если вы не брали готовый пакет у EnterpriseDB, а скачиваете все по отдельности, как я, то для поддержки функционала SQL-заданий вам нужно самому скачать и установить pgAgent (он уже есть в пакете Postgres Plus Standard Server от EnterpriseDB).

Живой пример использования pgAgent вы можете посмотреть Мониторинг терминальной сети на PostgreSQL


Обратите внимание, что в отличие от бесплатного MS SQL Express, который кастрирован не только на все дополнительные приблуды к SQL типа Analysis, Reporting, SSIS = но само ядро SQL сервера катрировано до невозмоожности - без аудита, без репликации, без компрессии, без материализованных вьюшек, без секционирования, с однопоточным обращением к индексам, без полнотекстового поиска, без мастеров экспорта/импорта данных, без оптимизатора JOIN-соединений, без почтовых уведомлений, без виртуализации, без сборок, без тьюнинг-адвизора, без профайлера - любая установка PostgreSQL полнофункциональна и может быть в любой момент дополнена любым из четырехсот программ-спутников PostgreSQL.


Вероятно, при соскоке с MS-платформы вам также понадобится привычный по MS SQL построитель ER-диаграмм. Здесь это совершенно отдельный софт, не входящий в состав PostgreSQL. Я использую SQL Power Architect - как и сам PG, это совершенно бесплатная прога . Он легко ставится и отлично работает.


Для перегрузки своих существующих данных из MS SQL в среду PostgreSQL вы можете воспользоватся моей программой ScriptManager. Обратите внимание, что я не поддерживаю работу моих программ в Windows 7. Последняя версия Windows, в среде которой я поддерживаю работу моих OpenSource-программ и моих публичных компонентов ASP.NET-сайтов - Windows 2003 и Windows 2008. В дальнейшем работа всех моих популярных публичных .NET-программ и моих популярных компонентов ASP.NET-сайтов будет поддерживатся только в Windows XP-2003-2008 и в Linux.

Вы можете также выполнить перегрузку данных из MS SQL в PostgreSqL с помощью PostgreSQL Native OLEDB Provider (PGNP), а для переноса данных между серверами можно пользоваться аналогами MS SQL-функции OpenRowset - PostgreSQL-функцией DBLINK.


Чтобы побыстрее перейти в комфортную графическую среду PgAdmin3 в Linux чтобы начать делать ASP.NET сайт в Linux. Для начала надо установить Postgres и PgAdmin из текущего репозитария (например с компакта). В результате установки получится несколько config-файлов, в которые надо сразу же внести изменение - чтобы к серверу postgres можно было коннектится с локальной машины. После этого надо запустить сервис postgresql, создать первого суперюзера скриптом createuser и приконнектится к серверу из PgAdmin в контексте этого суперюзера.

Обратите внимание, что PostgreSQL работает не только на процессорных архитектурах X86 и X64, но и фактически везде где работает Linux - s390, s390x (32 and 64 bits), SPARC (32), PowerPC, AMD64, IA64, ARM, MIPS - включая самые быстрые серийные супер-компьютеры в мире - IBM/390 серий G5/G6/G900, производительностью более 1000 MIPS.

PostgreSQL поддерживает множество языков программирования C, C++, PL/Java, PL/R, PL/Lua, PL/LOLCODE, PL/Perl, pl/PHP, PL/Python, PL/Ruby, PL/sh, PL/Tc, PL/Scheme (но к сожалению не поддерживает бейсик и C#) - имеется ввиду языки на которых можно сделать сборку и утопить ее во внутрь СУБД. Обратиться из бейсика и C# в к процедурам PostgreSQL (так же как вы обращаетесь к процедурам MySQL или MS SQL) вы, конечно можете из VB и C#.


Теперь посмотрим как работать с этой СУБД из MS Visual Studio. Для начала надо асилить ту простую мысль, что интеграции с дизайн-тайм инструментами у PostgreSQL-клиентов Visual Studio 2008 нет (по крайней мере я не знаю). Те о существованиии SqlDataSource и Server Explorer в Visual Studio 2008 вы можете забыть.

Но работать очень просто. Создайте новую табличку в pgAdmin. Для теста внесите туда какие-нибудь данные. Теперь попробуем их получить в ASP.NET.

При инсталяции вы должны были поставить пакет Npgsql. Теперь надо сделать три сборки 'этого пакета (Npgsql.dll, Mono.Security.dll, policy.2.0.Npgsql.dll) доступными для вашего проекта. Это можно сделать либо Project->Add reference либо постановкой их в GAC. Может быть без этого можно как-то обойтись, но поскольку это провайдер данных - я заношу Npgsql.dll еще и в секцию провайдеров DbProviderFactories в machine.config.


Как правильно построить ConnectionString для Npgsql можно посмотреть здесь. В моей среде строка коннекта выглядит вот так: HOST=127.0.0.1;PORT=5432;PROTOCOL=3;DATABASE=Disk;USER ID=postgres;PASSWORD=XXXXXX;SSL=False;SSLMODE=Disable;TIMEOUT=15;SEARCHPATH=;POOLING=True;CONNECTIONLIFETIME=15;MINPOOLSIZE=1;MAXPOOLSIZE=20;SYNCNOTIFICATION=False;COMMANDTIMEOUT=20;ENLIST=False;PRELOADREADER=False;USEEXTENDEDTYPES=False;INTEGRATED SECURITY=False;COMPATIBLE=2.0.8.0. Параметры HOST,PORT,DATABASE,USER ID,PASSWORD указывать обязательно, остальные параметры Npgsql здесь добавил по умолчанию.Обратите внимание на важность параметров MAXPOOLSIZE и CONNECTIONLIFETIME - они должны быть разные для desctop-приложений с постоянным коннектом и для Web-приложений, которые открывают новый коннект на каждый новый реквест, как вот в этом моем примере - Этюды на ASP.NET. Пример сайта на СУБД PostgreSQL - пул коннектов исчерпывается очень быстро и коннекты должны возвращаться в пул по таймауту. Другой вариант - сделать перманентный коннект Web-приложения к серверу, как у десктопного приложения.


Инструкцию как переводить ASP.NET приложение на PostgreSQL c платформы Win на платформу MONO, выложили в сети разработчики MONO - Guide:_Porting_ASP.NET_Applications. А я покажу вам в дополнение к Примеру сайта на СУБД PostgreSQL еще и реальный пример BLL на Postgres для десктопного приложения на MONO.


Технологические возможности PostgreSQL поражают воображение. В нем нет тупости билогейтсовского сервера, типа запрета вызывать из одной хранимой процедуры другую с получением рекордсета от внутренней процедуры, запрета на сортировку во вьюхах или ограничений на код внутри SQL-функций.

Наряду с тривиальными операциями доступными даже в MS SQL (например Экспорт данных из PostgeSQL в XML)типом данных могут служить массивы, в одном столбце можно вернуть целую строку таблицы. В PostgreSQL необычайно просто выполнять даже совершенно фантастические операции, например Выполняем разворот строк в столбцы в MS SQL и PostgreSQL.


PostgreSQL является объектной СУБД. Таблицы могут строиться на основании других таблиц. Функции могут быть перегруженными - вы готовите несколько вариантов функций для разных типов параметров, а ядро СУБД само выбирает нужную функцию. Но наиболее полезным мне представляется использование массивов и собственных типов (агрегатов) - когда в одной столбце таблицы можно хранить не атомарные данные, а целые сложные агрегатные типы. Если вы научитесь этим пользоваться - это существеннейшим образом сократит ваш код. Я сделал обучающий пример, наглядно показывающий полезность обьектных подходов - Пример обьектно-реляционного проектирования структуры данных в PostgreSQL


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


Для PostgreSQL существует множество механизмов репликации и организации распределенной СУБД. А я внес свой вклад - написал собственный механизм для организации распреденной СУБД - Remote SQL execute for PostgreSQL on GSM/GPRS channel with extreme compress and cryptography. Специфика этого механизма - это максимальное сжатие трафика для использования связи между PostgreSQL-серверами по GSm/GPRS и использование встроенного ZIP-шифрованя без организации громоздкой инфраструктуры SSL-сертификатов.


http://www.pgcon.org/2009/schedule/speakers.en.html

А чтобы не сложилось впечатления, что я просто какой-то восхищенный PostgreSQL идиот, а достаточно критически настроенный ко всему эксперт (в том числе к PostgreSQL) - я в бочку меда добавлю ложку дегтя - Десять главных недостатков PostgreSQL. Здесь я суммировал ошибки (на мой взгляд) сделанные командой разработчиков PostgreSQL.



Комментарии к этой страничке ( )
ссылка на эту страничку: http://www.vb-net.ru/PostgreSQL/index.htm
<На главную>  <В раздел ASP>  <В раздел NET>  <В раздел SQL>  <В раздел Разное>  <Написать автору>  < Поблагодарить>