За последние 24 часа нас посетили 35553 программиста и 1819 роботов. Сейчас ищут 793 программиста ...

Параллельные соединения с БД

Тема в разделе "Прочие вопросы по PHP", создана пользователем alexey_baranov, 29 окт 2009.

  1. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Хочу поделиться своей находкой. а может даже узнать что она уже давно используется и есть спец термины для нее.

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

    раньше для этого я делал так:

    PHP:
    1. <?php
    2. $paralelConnection= new PDO(...) //вот этот код снаружи от реестра меня очень напрягал
    3. $mainConnection= $reestr->setConnection($paralelConnection)
    4.  
    5. //тут делается какой-то код. естесно он через реестр получает паралельное соединение и паралельную транзакцию. она или комитится или ролбечится
    6.  
    7. $reestr->setConnection($mainConnection)
    8.  
    потом этот код включил в реестр и у меня получилось

    PHP:
    1. <?php
    2. $reestr->setAltConnection()
    3.  
    4. //все тот же код
    5.  
    6. $reestr->setMainConnection();
    7.  
    а недавно допер до такого. добавил в реестр два метода. удобно аж писец не могу не написать

    PHP:
    1. <?php
    2. $reestr->pushConnection()
    3.  
    4. //тут все тот же код в параллельной транзакции
    5.  
    6. $reestr->popConnection()
    7.  
    методы используют приват массив как стэк для хранения соединений с бд и array_push() array_pop() для работы с ним. что хорошо, можно безопасно писать вложенный код с паралельными соединениями, и количество этих вложений не ограничено
     
  2. kostyl

    kostyl Guest

    alexey_baranov
    да, бывает вкусно. Ты наверно не читал Фаулера...
     
  3. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    местами читал паттерны, но так чтобы целую книгу не было. а как по науке это делается, паттерн мож какой известный есть?
     
  4. kostyl

    kostyl Guest

    alexey_baranov
    есть типа пул соединений.. Тоже самое что у тебя.
     
  5. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    kostyl
    про пул не знаю. я знаю только обячный пул соединений, который кэширует их. а другого не нашел. есть где почитать?

    Когда zf будет наконец на 5.3 можно будет еще проще на замыканиях написать один метод для вообще любого ресурса. Например

    PHP:
    1.  
    2. <?php
    3. $altLog= new Zend_Log();
    4. $altLdap= new Zend_LDAP();
    5.  
    6. $registry->withResourse('log', $altLog){
    7.  
    8.   //теперь код вместо лога пишет в $altLog
    9.  
    10.   $registry->withResourse('ldap', $altLdap){
    11.     //код, который пишет в $altLog и читает из $altLdap
    12.   }
    13. }
    14.  
    15. //тут код работает обратно на обычных настройках
    а внутри withResourse()
    перед вызовом замыкания в стэк старое значение
    после замыкания вернуть старое на место
    и обернуть его еще на всякий случай в try catch и вернуть старое в случае ошибки
     
  6. kostyl

    kostyl Guest

    а я про него и говорю ))
    без понятия, никогда не искал...