powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно работать с БД в вэб-приложениях?
26 сообщений из 26, показаны все 2 страниц
Как правильно работать с БД в вэб-приложениях?
    #36796022
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
Поделитесь, пожалуйста, опытом или ткните в умную книгу, где бы описывалась "правильная" технология взаимодействия вэб-приложения с БД.

Меня интересуют такие вопросы:

1. Как соотнести сессию БД и сеанс обслуживания вэб-запроса.
Т.е. нужно ли порождать для каждого запроса новую сессию, или для текущего пользователя, или как-то иначе?
2. Следует ли прибегать к транзакциям на чтение?
3. Если привязывать сессию БД к вэб-сессии, то где хранить данные о ней? В контексте вызова? В каком-то внутреннем массиве с доступом по определенному идентификатору?
4. Какие манипуляции производить при BeginRequest и EndRequest?
5. Полезно ли отслеживать стадии жизненного цикла страницы в ракурсе доступа к данным?
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796059
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльДобрый день, коллеги!
Поделитесь, пожалуйста, опытом или ткните в умную книгу, где бы описывалась "правильная" технология взаимодействия вэб-приложения с БД.

Меня интересуют такие вопросы:

1. Как соотнести сессию БД и сеанс обслуживания вэб-запроса.
Т.е. нужно ли порождать для каждого запроса новую сессию, или для текущего пользователя, или как-то иначе?
2. Следует ли прибегать к транзакциям на чтение?
3. Если привязывать сессию БД к вэб-сессии, то где хранить данные о ней? В контексте вызова? В каком-то внутреннем массиве с доступом по определенному идентификатору?
4. Какие манипуляции производить при BeginRequest и EndRequest?
5. Полезно ли отслеживать стадии жизненного цикла страницы в ракурсе доступа к данным?


вы про ASP/ASP.NET? есть такое понятие как connection pooling, почитайте про него
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796174
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One


вы про ASP/ASP.NET? есть такое понятие как connection pooling, почитайте про него

Ху-у-уже! Я про ASP.NET MVC!
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796214
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльKonst_One


вы про ASP/ASP.NET? есть такое понятие как connection pooling, почитайте про него

Ху-у-уже! Я про ASP.NET MVC!

без разницы, pooling всё равно задействован будет
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796230
Datar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Общие правила не изменились со времен первого фржймворка.

1. Вообще-то никак. Главное правило: как можно позже отрыть подключение, как можно раньше его закрыть. Т.е. ответ да, лутче порождать.
2. Если вам нужна согласованность данных то да. Обычно нет, так как в веб-приложениях принято кэширование
3. Категорически не рекомендуется, пул переполнится. Все запросы должны быть примерно такими:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
using (var con = CreateConnection())
{
  var _cmd =   con.CreateComand();
  var _rd = _cmd.ExecuteReader();
  while (_rd.Read())
  {
   ...
  }
}
Код: plaintext
1.
2.
3.
4.
MyDataSetTable result;
using (var _ta = new MySQLTableAdapter())
{
  result =  _ta.GetDataBYXXX(XXX);
}

Код: plaintext
1.
2.
3.
4.
5.
IEnumerable result;
using (var _dctx = new DataContext())
{
  _dctx.ObjectTrackingEnabled = false;
  result =  _ta.EntityName.Where(c => c.XXX == XX).ToList();
}
4. Асинхронные
5. Очень полезно, Linq2SQL имеет специальный лог для этого.
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796287
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One
есть такое понятие как connection pooling, почитайте про него

Спасибо! Я немного знаком с этим понятием. Имею некоторый опыт работы с ADO.NET в "толстых приложениях". Поэтому-то я и озабочен исследованием нюансов, связанных с доступом данных в вэб-приложениях. В них работать по аналогии с обычными приложениями не получится.

DatarОбщие правила не изменились со времен первого фржймворка.

1. Вообще-то никак. Главное правило: как можно позже отрыть подключение, как можно раньше его закрыть. Т.е. ответ да, лутче порождать.
2. Если вам нужна согласованность данных то да. Обычно нет, так как в веб-приложениях принято кэширование
3. Категорически не рекомендуется, пул переполнится. Все запросы должны быть примерно такими:
4. Асинхронные
5. Очень полезно, Linq2SQL имеет специальный лог для этого.

1. По какому событию сервер может породить соединение с БД?
2. Я вообще не видел каких либо рекомендаций ораклистов по транзакциям на чтение, а разработчики вэб-приложений используют их сплошь и рядом...
3. Что именно переполнит пул?
4. В используемых мной примерах сессия открывается по требованию, по событию BeginRequest открывается транзакция, а по EndRequest - закрывается сессия. Это хороший стиль?
5. Жаль, что нет Linq2Oracle. Я использую NHibernate и мне не знакомы какие-либо его средства взаимодействия с жизненным циклом страницы.
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796320
Datar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон, похоже в 4 пункте вы говорите про события global.asax, я не то вам ответил..
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796342
Datar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DatarОбщие правила не изменились со времен первого фржймворка.

1. Вообще-то никак. Главное правило: как можно позже отрыть подключение, как можно раньше его закрыть. Т.е. ответ да, лутче порождать.
2. Если вам нужна согласованность данных то да. Обычно нет, так как в веб-приложениях принято кэширование
3. Категорически не рекомендуется, пул переполнится. Все запросы должны быть примерно такими:
4. Асинхронные
5. Очень полезно, Linq2SQL имеет специальный лог для этого.

1. По какому событию сервер может породить соединение с БД?
2. Я вообще не видел каких либо рекомендаций ораклистов по транзакциям на чтение, а разработчики вэб-приложений используют их сплошь и рядом...
3. Что именно переполнит пул?
4. В используемых мной примерах сессия открывается по требованию, по событию BeginRequest открывается транзакция, а по EndRequest - закрывается сессия. Это хороший стиль?
5. Жаль, что нет Linq2Oracle. Я использую NHibernate и мне не знакомы какие-либо его средства взаимодействия с жизненным циклом страницы.[/quot]

1. Для этого не нужно события, просто создавайте объект подключения в нужном месте кода и подключайтесь к БД.
3. Сообщения вида "Подключение занято выдачей результатов для другой команды" не случаются у вас на продакшин сервере? Переполнить пул могут сессии вашего веб-приложения, в который вы храните открытый конекшин. Вообще конекшинов приложение может открыть не очень много (кажется все 25, определяется настройкой), поэтому вы должны не допускать долгого открытого подключения. Чем дольше подключение открыто тем менее эфективно работает ваше приложение, так как это подключение приложение может использовать в другом месте.
4. Пологаю что плохой, так как протеворечит правилу позже открыть, раньше закрыть. У вас конекшин будет открыт на протяжении всего жизненого цикла страницы, тогда как данные из него вообще могут не понадобиться.
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796384
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Datar,
Я нагнал сумбура с понятиями сессия, соединение, сеанс и т.п. аж сам себя запутал :)
Помогите мне, пожалуйста, съесть слона по частям! ;) Только не уходите с линии!
Я больше нуждаюсь в знаниях о вэб-технологиях, чем в области доступа к БД.

Вопрос №1: HttpApplication в вэб-приложениях - это процесс в единственном экземпляре, запускаемый на сервере однократно (в идеале), или для каждого обращения к серверу создается свой HttpApplication, который умирает в конце жизненного цикла?
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796410
Datar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению я могу ошибится, но с большой долей уверености могу сказать "НЕТ". Все зависит от физической архитектуры. Скажу так, обычно на одном сервере создается один HttpApplication, кроме момента рестарта приложения. Если у вас ферма, то соответствено HttpApplication будет по одному на каждом сервере фермы, и к какому имено HttpApplication будет направлен конкретный запрос предугадать сложно, первый запрос может обработаться на одном сервера, второй запрос обработаться совершено на другом. Что касается одного сервера, то в момент рестарта приложения пророждается второй HttpApplication и некоторое время они живут вместе, пока первый не закончит обработку всех своих запросов и не выгрузится из памяти. Этот момент обычно длится пару секунд.
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796423
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Datar,

Так! Это знание уже весьма важно для меня! Мне не интересно, что там думает "клиент" - мне пока надо разобраться с сервером. Допустим, что он единственный. Значит для него запускается единственное HttpApplication (рестарт опустим)?
Если так, то каким образом из событий BeginRequest и EndRequest понять, какой именно клиент породил эти события и с чьей именно сессией я должен произвести определенные манипуляции?
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796464
Datar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модель конвейера НТТР не моя сильная сторона, но если мне не изменяет память в BeginRequest вы не сможите определить сессию клиента. Опять таки могу ошибиться, но кажется только начиная с события AcquireRequestState клиентская сессия доступна.
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796483
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Datar,
Отлично! Это уже мой "маленький шаг для человека..." (с)

Теперь короткий вопрос про HttpContext.
Можно ли предположить, что в одно и то же время в HttpApplication существует не более одного HttpContext?
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796512
Datar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Затрудняюсь ответить, но поскольку HttpContext связан с конкретным HTTP запросом логично предположить что их может быть несколько у приложения.

Я немножко не понимаю смысл подобных вопросов в рамках топика. Если расматривать вопрос об организации работы с БД в приложении вам точно не нужно рассматривать конвейр HTTP запросов.
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796526
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
private const string sessionKey = "NHib.SessionKey";
public static ISession CurrentSession
{
    get { return GetSession(true); }
}

private static ISession GetSession(bool getNewIfNotExists)
{
    ISession currentSession;
    if (HttpContext.Current != null)
    {
        HttpContext context = HttpContext.Current;
        currentSession = context.Items[sessionKey] as ISession;
        if (currentSession == null && getNewIfNotExists)
        {
            currentSession = sessionFactory.OpenSession();
            context.Items[sessionKey] = currentSession;
        }
    }
    else
    {
        currentSession = CallContext.GetData(sessionKey) as ISession;
        if (currentSession == null && getNewIfNotExists)
        {
            currentSession = sessionFactory.OpenSession();
            CallContext.SetData(sessionKey, currentSession);
        }
    }
    return currentSession;
}
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796560
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36796630
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Но все равно спасибо! Буду изучать и прикручивать все полезное с своему велосипеду ;)
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36797059
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolYUtor,
Еще раз спасибо за "велосипед"! Для стандартного ASP.NET проекта это бесценный кладезь знаний о том, как правильно выстроить архитектуру DB-ориентированного вэб-приложения. Да и по мелочам я много чего полезного из него извлек.
Но в ASP.NET MVC изначально заложена даже более совершенная модель многоуровневого приложения.
В этой связи хотел бы заострить внимание на одном аспекте работы приложения (который меня так беспокоит, что я затеял все это обсуждение) - сопоставлении вэб-сессии и DB-сессии.
В приведенном выше примере для этого используется класс "public class RequestHttpModule : IHttpModule" и, в частности, его метод:
Код: plaintext
1.
2.
3.
        public void context_BeginRequest(Object sender, EventArgs e)
        {
            ManagedWebSessionContext.Bind(HttpContext.Current, SessionManager.SessionFactory.OpenSession());
        }

В приведенном мною примере это реализуется похоже. Но мой взят из ASP.NET MVC, в то время, как в ASP.NET MVC 2 приятно видоизменилась фабрика контроллеров, а именно: в методе GetControllerInstance появился параметр RequestContext. Так нельзя ли этот метод использовать для привязки вэб-сессии к DB-сессии? К тому же он мной и так используется для инжекции модели (DataManager) в "фабрикуемый" контроллер.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                throw new HttpException(0x194, "NoControllerFound");
            }
            ISession dbSession = Domain.GetSession(requestContext);
            return (Activator.CreateInstance(controllerType, new DataManager(dbSession)) as IController);
        }

Пожалуйста, с высоты своего опыта, оцените возможность или абсурдность такого использования.
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36800150
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я на винмордах специализируюсь, посему ответа на дам. Да пребудет с вами гугл .
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36801137
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльDatar,
Отлично! Это уже мой "маленький шаг для человека..." (с)

Теперь короткий вопрос про HttpContext.
Можно ли предположить, что в одно и то же время в HttpApplication существует не более одного HttpContext?

Нет !!!! их сотни-тысячи одновременно (если сайт достойный)
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36801140
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationКурдльDatar,
Отлично! Это уже мой "маленький шаг для человека..." (с)

Теперь короткий вопрос про HttpContext.
Можно ли предположить, что в одно и то же время в HttpApplication существует не более одного HttpContext?

Нет !!!! их сотни-тысячи одновременно (если сайт достойный)

тобишь по числу запросов
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36801192
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationКурдльDatar,
Отлично! Это уже мой "маленький шаг для человека..." (с)

Теперь короткий вопрос про HttpContext.
Можно ли предположить, что в одно и то же время в HttpApplication существует не более одного HttpContext?

Нет !!!! их сотни-тысячи одновременно (если сайт достойный)

Может быть я неточно выразился.
Меня интересует, кто такой "HttpContext. Current "? Особенно последняя его часть.
Вроде переводится она, как "текущий". И используется это выражение в единственном инстансе Application, как мы выяснили ранее.
В приведенном мной примере http://sql.ru/forum/actualthread.aspx?tid=782387#9278620 это свойство применяется для однозначной привязки сессии БД с вэб-запросом.
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36818150
Var79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курдль
1. Как соотнести сессию БД и сеанс обслуживания вэб-запроса.
Т.е. нужно ли порождать для каждого запроса новую сессию, или для текущего пользователя, или как-то иначе?

3. Если привязывать сессию БД к вэб-сессии, то где хранить данные о ней? В контексте вызова? В каком-то внутреннем массиве с доступом по определенному идентификатору?
4. Какие манипуляции производить при BeginRequest и EndRequest?


1) никак, делайте так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class ProductsController : Controller
{
        public FileContentResult GetImage(int productId)
        {
            Product product = (from p in productsRepository.Products
                               where p.ProductId == productId
                               select p).First();//ИЛИ ТУТ БЕЗ ИСПОЛЬЗОВАНИЯ LINQ юзаем код 3

            return File(product.ImageData, product.ImageMimeType);
        }
}

где productsRepository.Products примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        public IQueryable<Product> Products
        {
            get { return dbContext.Products; }
        }

        public SqlProductsRepository(string connectionString)
        {
            dbContext = new SportStoreDBEntities(connectionString);
        }

код 3
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
using (var con = CreateConnection())
{
  var cmd =   con.CreateComand();
  var rd = cmd.ExecuteReader();
  while (rd.Read())
  {
   ...
  }
}

3) не привязывайте БД к веб-сессии!
4) забудьте об этом, это не нужно для работы с БД
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36818277
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльМеня интересует, кто такой "HttpContext. Current "? Особенно последняя его часть.
А в справке этого не написано?
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36818293
Курдль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКурдльМеня интересует, кто такой "HttpContext. Current "? Особенно последняя его часть.
А в справке этого не написано?

Написано дословно: "Возвращает или задает объект HttpContext для текущего HTTP-запроса."
Для меня это означает, что существует конвейер обработки запросов, который подразумевает, что в момент времени существует лишь один запрос, к которому из любой точки приложения в этот момент можно обратиться по HttpContext.Current.
Я несколькими постами ранее просил подтвердить эту сентенцию, на что мне дали отрицательный ответ:
http://sql.ru/forum/actualpost.aspx?bid=12&tid=782387&mid=9347232&p=1&act=quot#9292755

Теперь, видимо, Ваша очередь вступить, раз уж вмешались! ;)
...
Рейтинг: 0 / 0
Как правильно работать с БД в вэб-приложениях?
    #36818342
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КурдльТеперь, видимо, Ваша очередь вступить, раз уж вмешались! ;)
Не, лениво, я лучше помониторю чутка :)
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как правильно работать с БД в вэб-приложениях?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]