|
|
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Поделитесь, пожалуйста, опытом или ткните в умную книгу, где бы описывалась "правильная" технология взаимодействия вэб-приложения с БД. Меня интересуют такие вопросы: 1. Как соотнести сессию БД и сеанс обслуживания вэб-запроса. Т.е. нужно ли порождать для каждого запроса новую сессию, или для текущего пользователя, или как-то иначе? 2. Следует ли прибегать к транзакциям на чтение? 3. Если привязывать сессию БД к вэб-сессии, то где хранить данные о ней? В контексте вызова? В каком-то внутреннем массиве с доступом по определенному идентификатору? 4. Какие манипуляции производить при BeginRequest и EndRequest? 5. Полезно ли отслеживать стадии жизненного цикла страницы в ракурсе доступа к данным? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 16:42 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
КурдльДобрый день, коллеги! Поделитесь, пожалуйста, опытом или ткните в умную книгу, где бы описывалась "правильная" технология взаимодействия вэб-приложения с БД. Меня интересуют такие вопросы: 1. Как соотнести сессию БД и сеанс обслуживания вэб-запроса. Т.е. нужно ли порождать для каждого запроса новую сессию, или для текущего пользователя, или как-то иначе? 2. Следует ли прибегать к транзакциям на чтение? 3. Если привязывать сессию БД к вэб-сессии, то где хранить данные о ней? В контексте вызова? В каком-то внутреннем массиве с доступом по определенному идентификатору? 4. Какие манипуляции производить при BeginRequest и EndRequest? 5. Полезно ли отслеживать стадии жизненного цикла страницы в ракурсе доступа к данным? вы про ASP/ASP.NET? есть такое понятие как connection pooling, почитайте про него ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 16:50 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Konst_One вы про ASP/ASP.NET? есть такое понятие как connection pooling, почитайте про него Ху-у-уже! Я про ASP.NET MVC! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 17:32 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
КурдльKonst_One вы про ASP/ASP.NET? есть такое понятие как connection pooling, почитайте про него Ху-у-уже! Я про ASP.NET MVC! без разницы, pooling всё равно задействован будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 17:45 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Общие правила не изменились со времен первого фржймворка. 1. Вообще-то никак. Главное правило: как можно позже отрыть подключение, как можно раньше его закрыть. Т.е. ответ да, лутче порождать. 2. Если вам нужна согласованность данных то да. Обычно нет, так как в веб-приложениях принято кэширование 3. Категорически не рекомендуется, пул переполнится. Все запросы должны быть примерно такими: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 5. Очень полезно, Linq2SQL имеет специальный лог для этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 17:51 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Konst_One есть такое понятие как connection pooling, почитайте про него Спасибо! Я немного знаком с этим понятием. Имею некоторый опыт работы с ADO.NET в "толстых приложениях". Поэтому-то я и озабочен исследованием нюансов, связанных с доступом данных в вэб-приложениях. В них работать по аналогии с обычными приложениями не получится. DatarОбщие правила не изменились со времен первого фржймворка. 1. Вообще-то никак. Главное правило: как можно позже отрыть подключение, как можно раньше его закрыть. Т.е. ответ да, лутче порождать. 2. Если вам нужна согласованность данных то да. Обычно нет, так как в веб-приложениях принято кэширование 3. Категорически не рекомендуется, пул переполнится. Все запросы должны быть примерно такими: 4. Асинхронные 5. Очень полезно, Linq2SQL имеет специальный лог для этого. 1. По какому событию сервер может породить соединение с БД? 2. Я вообще не видел каких либо рекомендаций ораклистов по транзакциям на чтение, а разработчики вэб-приложений используют их сплошь и рядом... 3. Что именно переполнит пул? 4. В используемых мной примерах сессия открывается по требованию, по событию BeginRequest открывается транзакция, а по EndRequest - закрывается сессия. Это хороший стиль? 5. Жаль, что нет Linq2Oracle. Я использую NHibernate и мне не знакомы какие-либо его средства взаимодействия с жизненным циклом страницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 18:10 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Пардон, похоже в 4 пункте вы говорите про события global.asax, я не то вам ответил.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 18:25 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
DatarОбщие правила не изменились со времен первого фржймворка. 1. Вообще-то никак. Главное правило: как можно позже отрыть подключение, как можно раньше его закрыть. Т.е. ответ да, лутче порождать. 2. Если вам нужна согласованность данных то да. Обычно нет, так как в веб-приложениях принято кэширование 3. Категорически не рекомендуется, пул переполнится. Все запросы должны быть примерно такими: 4. Асинхронные 5. Очень полезно, Linq2SQL имеет специальный лог для этого. 1. По какому событию сервер может породить соединение с БД? 2. Я вообще не видел каких либо рекомендаций ораклистов по транзакциям на чтение, а разработчики вэб-приложений используют их сплошь и рядом... 3. Что именно переполнит пул? 4. В используемых мной примерах сессия открывается по требованию, по событию BeginRequest открывается транзакция, а по EndRequest - закрывается сессия. Это хороший стиль? 5. Жаль, что нет Linq2Oracle. Я использую NHibernate и мне не знакомы какие-либо его средства взаимодействия с жизненным циклом страницы.[/quot] 1. Для этого не нужно события, просто создавайте объект подключения в нужном месте кода и подключайтесь к БД. 3. Сообщения вида "Подключение занято выдачей результатов для другой команды" не случаются у вас на продакшин сервере? Переполнить пул могут сессии вашего веб-приложения, в который вы храните открытый конекшин. Вообще конекшинов приложение может открыть не очень много (кажется все 25, определяется настройкой), поэтому вы должны не допускать долгого открытого подключения. Чем дольше подключение открыто тем менее эфективно работает ваше приложение, так как это подключение приложение может использовать в другом месте. 4. Пологаю что плохой, так как протеворечит правилу позже открыть, раньше закрыть. У вас конекшин будет открыт на протяжении всего жизненого цикла страницы, тогда как данные из него вообще могут не понадобиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 18:33 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Datar, Я нагнал сумбура с понятиями сессия, соединение, сеанс и т.п. аж сам себя запутал :) Помогите мне, пожалуйста, съесть слона по частям! ;) Только не уходите с линии! Я больше нуждаюсь в знаниях о вэб-технологиях, чем в области доступа к БД. Вопрос №1: HttpApplication в вэб-приложениях - это процесс в единственном экземпляре, запускаемый на сервере однократно (в идеале), или для каждого обращения к серверу создается свой HttpApplication, который умирает в конце жизненного цикла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 18:48 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
К сожалению я могу ошибится, но с большой долей уверености могу сказать "НЕТ". Все зависит от физической архитектуры. Скажу так, обычно на одном сервере создается один HttpApplication, кроме момента рестарта приложения. Если у вас ферма, то соответствено HttpApplication будет по одному на каждом сервере фермы, и к какому имено HttpApplication будет направлен конкретный запрос предугадать сложно, первый запрос может обработаться на одном сервера, второй запрос обработаться совершено на другом. Что касается одного сервера, то в момент рестарта приложения пророждается второй HttpApplication и некоторое время они живут вместе, пока первый не закончит обработку всех своих запросов и не выгрузится из памяти. Этот момент обычно длится пару секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 19:00 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Datar, Так! Это знание уже весьма важно для меня! Мне не интересно, что там думает "клиент" - мне пока надо разобраться с сервером. Допустим, что он единственный. Значит для него запускается единственное HttpApplication (рестарт опустим)? Если так, то каким образом из событий BeginRequest и EndRequest понять, какой именно клиент породил эти события и с чьей именно сессией я должен произвести определенные манипуляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 19:07 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Модель конвейера НТТР не моя сильная сторона, но если мне не изменяет память в BeginRequest вы не сможите определить сессию клиента. Опять таки могу ошибиться, но кажется только начиная с события AcquireRequestState клиентская сессия доступна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 19:35 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Datar, Отлично! Это уже мой "маленький шаг для человека..." (с) Теперь короткий вопрос про HttpContext. Можно ли предположить, что в одно и то же время в HttpApplication существует не более одного HttpContext? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 19:47 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Затрудняюсь ответить, но поскольку HttpContext связан с конкретным HTTP запросом логично предположить что их может быть несколько у приложения. Я немножко не понимаю смысл подобных вопросов в рамках топика. Если расматривать вопрос об организации работы с БД в приложении вам точно не нужно рассматривать конвейр HTTP запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 20:11 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
DatarЗатрудняюсь ответить, но поскольку HttpContext связан с конкретным HTTP запросом логично предположить что их может быть несколько у приложения. Я немножко не понимаю смысл подобных вопросов в рамках топика. Если расматривать вопрос об организации работы с БД в приложении вам точно не нужно рассматривать конвейр HTTP запросов. Я пытаюсь разобраться с типовыми (как считают их авторы) примерами доступа к данным. Пока не придумываю сам ничего. Вот один из наиболее распространенных в интернете: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 20:22 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 20:56 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
SolYUtor, "This web application sample is not a best practices sample for ASP.Net development, but future blogs will add features, especially where they take advantage of an NHibernate implementation." К тому же мне кажется, что к MVC можно применить более изящный подход, чем просто к ASP.NET Но все равно спасибо! Буду изучать и прикручивать все полезное с своему велосипеду ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2010, 21:53 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
SolYUtor, Еще раз спасибо за "велосипед"! Для стандартного ASP.NET проекта это бесценный кладезь знаний о том, как правильно выстроить архитектуру DB-ориентированного вэб-приложения. Да и по мелочам я много чего полезного из него извлек. Но в ASP.NET MVC изначально заложена даже более совершенная модель многоуровневого приложения. В этой связи хотел бы заострить внимание на одном аспекте работы приложения (который меня так беспокоит, что я затеял все это обсуждение) - сопоставлении вэб-сессии и DB-сессии. В приведенном выше примере для этого используется класс "public class RequestHttpModule : IHttpModule" и, в частности, его метод: Код: plaintext 1. 2. 3. В приведенном мною примере это реализуется похоже. Но мой взят из ASP.NET MVC, в то время, как в ASP.NET MVC 2 приятно видоизменилась фабрика контроллеров, а именно: в методе GetControllerInstance появился параметр RequestContext. Так нельзя ли этот метод использовать для привязки вэб-сессии к DB-сессии? К тому же он мной и так используется для инжекции модели (DataManager) в "фабрикуемый" контроллер. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Пожалуйста, с высоты своего опыта, оцените возможность или абсурдность такого использования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2010, 10:01 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Я на винмордах специализируюсь, посему ответа на дам. Да пребудет с вами гугл . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 14:00 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
КурдльDatar, Отлично! Это уже мой "маленький шаг для человека..." (с) Теперь короткий вопрос про HttpContext. Можно ли предположить, что в одно и то же время в HttpApplication существует не более одного HttpContext? Нет !!!! их сотни-тысячи одновременно (если сайт достойный) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 18:27 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
pationКурдльDatar, Отлично! Это уже мой "маленький шаг для человека..." (с) Теперь короткий вопрос про HttpContext. Можно ли предположить, что в одно и то же время в HttpApplication существует не более одного HttpContext? Нет !!!! их сотни-тысячи одновременно (если сайт достойный) тобишь по числу запросов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 18:28 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
pationКурдльDatar, Отлично! Это уже мой "маленький шаг для человека..." (с) Теперь короткий вопрос про HttpContext. Можно ли предположить, что в одно и то же время в HttpApplication существует не более одного HttpContext? Нет !!!! их сотни-тысячи одновременно (если сайт достойный) Может быть я неточно выразился. Меня интересует, кто такой "HttpContext. Current "? Особенно последняя его часть. Вроде переводится она, как "текущий". И используется это выражение в единственном инстансе Application, как мы выяснили ранее. В приведенном мной примере http://sql.ru/forum/actualthread.aspx?tid=782387#9278620 это свойство применяется для однозначной привязки сессии БД с вэб-запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 18:49 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
Курдль 1. Как соотнести сессию БД и сеанс обслуживания вэб-запроса. Т.е. нужно ли порождать для каждого запроса новую сессию, или для текущего пользователя, или как-то иначе? 3. Если привязывать сессию БД к вэб-сессии, то где хранить данные о ней? В контексте вызова? В каком-то внутреннем массиве с доступом по определенному идентификатору? 4. Какие манипуляции производить при BeginRequest и EndRequest? 1) никак, делайте так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. где productsRepository.Products примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. код 3 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 3) не привязывайте БД к веб-сессии! 4) забудьте об этом, это не нужно для работы с БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2010, 04:23 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
КурдльМеня интересует, кто такой "HttpContext. Current "? Особенно последняя его часть. А в справке этого не написано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2010, 09:41 |
|
||
|
Как правильно работать с БД в вэб-приложениях?
|
|||
|---|---|---|---|
|
#18+
МСУКурдльМеня интересует, кто такой "HttpContext. Current "? Особенно последняя его часть. А в справке этого не написано? Написано дословно: "Возвращает или задает объект HttpContext для текущего HTTP-запроса." Для меня это означает, что существует конвейер обработки запросов, который подразумевает, что в момент времени существует лишь один запрос, к которому из любой точки приложения в этот момент можно обратиться по HttpContext.Current. Я несколькими постами ранее просил подтвердить эту сентенцию, на что мне дали отрицательный ответ: http://sql.ru/forum/actualpost.aspx?bid=12&tid=782387&mid=9347232&p=1&act=quot#9292755 Теперь, видимо, Ваша очередь вступить, раз уж вмешались! ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2010, 09:51 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36796384&tid=1351115]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
160ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 461ms |

| 0 / 0 |
