Конференция "Базы" » Несколько запросов одновременно через один ADOConnection [D7, MSSQL]
 
  • dm37 (23.07.10 06:48) [0]
    Как лучше реализовать выполнение нескольких запросов из разных потоков к одному SQL-серверу (MSSQL):
    при старте программы установить одно соединение с SQL-сервером через ADOConnection, а потом при каждом запросе создавать объект ADOCommand и в свойстве Connection указывать ADOConnection. После работы разрушать объект ADOCommand?

    Или есть варианты получше.
  • sniknik © (23.07.10 09:32) [1]
    > Или есть варианты получше.
    убрать потоки, включить асинхронный режим.
  • Anatoly Podgoretsky © (23.07.10 09:55) [2]
    > sniknik  (23.07.2010 09:32:01)  [1]

    С индикацией прогресса по каждому запросу, что бы видеть паралельно запросы
    выполняются или последовательно.
  • sniknik © (23.07.10 10:12) [3]
    > Anatoly Podgoretsky ©   (23.07.10 09:55) [2]
    не получится, на клиенте можно получить только прогресс получения данных... выполнение остается "за кадром".
    хотя вроде бы поддерживается, т.е. передача запросов на выполнение конечно встанет в очередь (это документировано) также как и получение данных (вроде бы). но вот выполнение будет параллельным (по доке access jet по умолчанию поддерживает до 5 выполняющих потоков. а mssql что хуже что-ли?).
    хотя зачем это нужно не понимаю, сам стараюсь не пользоваться такой схемой после ряда тестов, когда выяснил, что несколько последовательно выполненных запросов в сумме требуют меньше времени чем те же самые параллельно. (хотя, с тех пор много времени прошло, и тестил на одно процессорной машине т.что ... может сейчас и есть смысл, но перепроверять не охота)
  • dm37 (23.07.10 10:28) [4]
    Наверно не полностью написал, что требуется:
    через tcp (IdTCPServer) приходит команда, которая после обработки направляется далее, один из вариантов на SQL-сервер. Т.е. поток создаётся обработчиком события IdTCPServer.
    Нужно выполнить этот запрос к SQL-серверу через ADOConnection, дождаться ответа и вернуть необходимые данные обратно через tcp (tcp соединение не разрывается).
  • Anatoly Podgoretsky © (23.07.10 10:35) [5]
    > sniknik  (23.07.2010 10:12:03)  [3]

    Я про него и говорю, поскольку проверять прогресс выполнения задания не
    надо, оно гарантировано паралельно для MSSQL серверб а для Акцесс не уверен,
    что исполнение и извлечение для одного соединения будет паралельным.
    При паралельном исполнение, часто суммарное время больше, но там и цель
    другая. Во всяком случае прогресс все покажет, с измерением времени и можно
    оба теста прогнать. В итоге будет ясность, а не предположение.
    Но я за потоки и отдельные соединения в них.

    Я в обычной однопотоковой модели не нахожу места для нескольких
    одновременных запросов.
  • Anatoly Podgoretsky © (23.07.10 10:36) [6]
    > dm37  (23.07.2010 10:28:04)  [4]

    То есть все таки поток, так зачем же мучаться, создавать условия для ошибок.
    Надо просто отдельный ADOConnection на каждое соединение.
  • Anatoly Podgoretsky © (23.07.10 10:40) [7]
    > dm37  (23.07.2010 10:28:04)  [4]

    У меня подобная схема с NNTP сервером, 14 паралельных запросов к SQL
    серверу, создают ровную 100 процентную нагрузку на 4 ядерный процессор, в
    течение нескольких секунд. Данные в потоке поступают с веб сервера, далее на
    SQL, далее клиенту NNTP - необязательная часть.
    Каждый поток абсолютно изолирован от других и от основного потока.
  • Плохиш © (23.07.10 11:25) [8]

    > dm37   (23.07.10 10:28) [4]

    Для начала стоит прочитать раздел в "Руководстве для разработчика" о веб-сервисах.

    PS. Любители изобретать велосипеды.
  • dm37 (23.07.10 14:06) [9]
    Сейчас проверил

    серверная часть:
    один ADOConnection
    два ADOCommand используют один ADOConnection

    с первого клиента по tcp отправил один долгий запрос (первый поток - ADOCommand1)
    а с другого клиента по tcp посылал быстрые запросы (второй поток - ADOCommand2)

    быстрые запросы успешно были выполнены, пока выполнялся длинный запрос

    Так нельзя делать? будут проблемы?
  • Anatoly Podgoretsky © (23.07.10 15:15) [10]
    Удалено модератором
  • stas © (23.07.10 16:44) [11]
    dm37   (23.07.10 14:06) [9]
    У меня в многопоточном приложении были проблемы с одним коннекшеном. Я избавился - просто стал писать в AdoCommand, ConnectionString, а не ссылку на connection по сути это равносильно созданию отдельного AdoConnection.
  • MsGuns © (23.07.10 20:26) [12]
    Из собственного опыта - "ручное" управление (ясно что в асинхронном режиме) следует организовывать по принципу "один запрос-одно соединение"

    Иначе получались "грабли" (пусть сникник покроет позором - ему не привыкать :))
  • Loginov Dmitry © (25.07.10 18:00) [13]

    > через tcp (IdTCPServer) приходит команда, которая после
    > обработки направляется далее, один из вариантов на SQL-сервер.
    >  Т.е. поток создаётся обработчиком события IdTCPServer.
    > Нужно выполнить этот запрос к SQL-серверу через ADOConnection,
    >  дождаться ответа и вернуть необходимые данные обратно через
    > tcp (tcp соединение не разрывается).


    В таком случае однозначно для каждого потока должен быть отдельный ADOConnection. Типичный способ решения - это организовать пул подключений.
    Хотя возможно, что такой пул создается автоматически, тогда очень просто: создаешь объект -> подключаешься к БД -> выполняешь запрос -> отключаешься от БД -> уничтожаешь объект.
 
Конференция "Базы" » Несколько запросов одновременно через один ADOConnection [D7, MSSQL]
Есть новые Нет новых   [134433   +22][b:0.001][p:0.001]