#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 всегда использует одни и те же подключения, даже если экземпляры нескольких экземпляров объекта имеют разные идентификаторы ресурсов.