Использование нескольких подключений с помощью mysql_unbuffered_query

#php #mysql #unbuffered-queries

#php #mysql #небуферизованные запросы

Вопрос:

Возможно ли обойти ограничение mysql_unbuffered_query (), заключающееся в одновременном выполнении одного запроса, путем открытия второго подключения?

Например, следующий код выдает мне ошибку:

mysql_select_db(): функция, вызываемая без предварительной выборки всех строк из предыдущего небуферизованного запроса

         $feedData =  mysql_unbuffered_query($sql, $this->_unbufferedDbManager->db->connection);

        while ($record = mysql_fetch_assoc($feedData)) {
            File::fputcsv($this->_fileHandle, $record, $this->delimiter, $this->enclosure);       

            $sql = "UPDATE   transactions
                    SET      feed_transmit_date = '$this->today'
                    WHERE    transaction_id = " . $record['transaction_id'];
            $this->dbManager->DbQuery($sql);

            print_r($this->_unbufferedDbManager->db->connection);
            print_r($this->dbManager->db->connection);
        }
  

Два параметра print_r() в конечном выводе:
Идентификатор ресурса #637 Идентификатор ресурса #639

DBManager — это старый уровень доступа к данным pear

Примечание: Я бы использовал тег mysql_unbuffered_query, но недавно я открыл бонус, который поместил меня ниже привилегии «создавать новые теги».

Комментарии:

1. Каждое подключение / дескриптор к базе данных получает свой собственный контекст, так что да, вы можете открывать несколько подключений и запускать независимые запросы к каждому. Просто будьте осторожны, указывая правильный дескриптор подключения во всех вызовах mysql_ *(), иначе вы получите очень странные / плохие результаты от смешивания операций между ними.

2. Поскольку кажется, что у вас есть 2 разных подключения к БД (разные идентификаторы ресурсов), это должно работать. В качестве дополнительной заметки, возможно, было бы лучше выполнить UPDATE s все сразу после цикла, чтобы небуферизованный запрос быстро выполнялся со всей его выборкой?

3. @Fanis — Это то, что мы пробовали изначально, и это определенно был более эффективный метод. Проблема в том, что стало слишком сложно отслеживать ошибки, исходный запрос выбирается из другой таблицы и базы данных, чем запрос обновления, и они немного сложнее, чем я привел в качестве примера для этого вопроса. Возможно, я просто получаю вводящее в заблуждение сообщение об ошибке, и я вызываю неправильное дерево для решения.

4. Я попытался воссоздать некоторые из них, но не получил вашу ошибку при использовании 2 разных подключений к mysql. Я предполагаю, что mysql_select_db() что вызывает ошибку, происходит в $this->dbManager->DbQuery($sql); вызове?

5. Это так, да. Сначала я подумал, может быть, это потому, что я пытался выполнить запись в таблицу, заблокированную небуферизованным запросом, поэтому я создал новую таблицу для записи, просто чтобы проверить. Те же результаты.

Ответ №1:

По предложению PMV я пишу этот ответ. В общем, проблема заключалась в том, что разные классы баз данных использовали одно и то же соединение, хотя они сообщали разные идентификаторы ресурсов. Подробнее смотрите в комментариях к вопросу.

Комментарии:

1. DBManager pear всегда использует одни и те же подключения, даже если экземпляры нескольких экземпляров объекта имеют разные идентификаторы ресурсов.