Соединение занято с результатами для другой ошибки hstmt - PullRequest
3 голосов
/ 19 января 2011

Я новичок.Я написал большинство моих запросов на PHP.Я создал объект подключения и затем нажал на sql server.

function navigation($sel_subject, $sel_page,$filter=false) {

    $subject_set = get_all_subjects();
    $page_set = get_pages_for_subject($subject["id"],$sec_wp,$filter);
}

function get_all_subjects() {
    global $connection;
    $query = "  SELECT * FROM subjects ORDER BY position ";
    return odbc_exec($connection,$query);
}

Теперь я обновляю несколько простых запросов, которым просто нужно получить данные из базы данных.Я обновляю их до хранимых процедур.

function get_all_subjects() {    global $connection;
    $query = "  EXEC get_all_subjects ";  
 return odbc_exec($connection,$query); }

Я получаю сообщение об ошибке. Соединение занято с результатами для другой ошибки hstmt

Я использую SQL Server 2005 и с соединителями ODBC.

Как лучше всего решить эту проблему.Или лучше спросить администратора, могут ли они сделать что-то вроде http://sourceitsoftware.blogspot.com/2008/06/connection-is-busy-with-results-for.html Оттар Холстад сказал ... При использовании BDE для подключения к MS SQL Server через ODBC это может (иногда?) Быть решеноиспользуя собственный клиент SQL вместо драйвера SQL Server для ODBC.

Я хотел бы знать, что лучше активировать MARS (несколько активных наборов результатов).Если это так, пожалуйста, помогите мне предоставить пошаговую процедуру, чтобы включить то же самое.

Ответы [ 4 ]

4 голосов
/ 31 января 2011

Вы должны включить MARS (Multiple Active Resultset), который по умолчанию отключен.Вы можете избежать этого сообщения об ошибке, переключившись на «Собственный клиент SQL».Для получения дополнительной информации проверьте это

1 голос
/ 24 января 2011

Можете ли вы попробовать добавить odbc_free_result вызовы, когда вы закончите с результатами odbc_exec?

0 голосов
/ 27 января 2011

Я бы сказал, что потенциальное решение состоит из трех частей.

Во-первых, лучше оптимизировать оператор SQL.

Попробуйте использовать оператор LIMIT и отойдите от использования *и определите только те поля, которые вам нужны.Эти две вещи могут помочь уменьшить нагрузку на память для оператора SQL.

Во-вторых, попробуйте оптимизировать структуру таблицы базы данных лучше (например: уменьшить значения Keyname / Index и тому подобное.) Если ваша база данных имеет какой-либо значительный размер(скажем, 50000 строк или больше), возможно, попробуйте переключиться на InnoDB, чтобы предотвратить блокировку строк.Вы также можете попытаться выполнить некоторое дублирование таблиц и выполнить запрос из вторичных (временных) таблиц БД, чтобы уменьшить нагрузку на ваш основной БД.Очевидно, что без того, чтобы мы не знали вашу схему БД, это только я «выкидываю предложение».

В-третьих, если вы не ударяете по БД с 1 миллионом строк плюс, и вы получаете ошибку Connection Busy, шансы довольно хорошиечто вам нужно поговорить с вашим хостинг-провайдером.Даже на разделяемом сервере подобные сообщения об ошибках (если ваш код оптимизирован настолько, насколько это возможно) почти всегда являются результатом того, что вашему серверу не хватает памяти.

Как было указано Cyberkiwi, вы можете попробоватьсбросив ADOdb в свой ftp и выполнив простой цикл, просто чтобы посмотреть, поможет ли распределение внутренней памяти ADOdb вообще.Это было бы так же просто, как выгрузка ADOdb, включая ADOdb, и выполнение следующего цикла:

$Data = $connection->Execute("SELECT field1, field2, field2 FROM subjects ORDER BY position ASC LIMIT 0, 10");
if (is_object($Data)&&(!$Data->EOF))
{
    while (!$Data->EOF)
    {
        //
        // string, array, echo, whatever here
        //
    $Data->MoveNext();
    }
}
unset($Data);

В конце концов, эти ошибки являются результатом плохо написанного оператора SQL, который приводит к тому, что несколько соединений будутостановка (в этом случае попросите увеличить ваши «макс. одновременные соединения») или просто недостаточно встроенной памяти или выделенной памяти php (в этом случае попросите увеличить «memory_limit»).

0 голосов
/ 25 января 2011

Я рекомендую вместо этого другие фреймворки, такие как

Они должны быть более гибкими ипродвинутый, чем odbc_.odbc_exec стремится вернуть серверный курсор, который не позволяет выполнять другой запрос на том же соединении.Курсор на стороне клиента передает все данные в виде статического снимка клиенту за один раз, поэтому соединение бесплатно для других запросов.

Оставаясь с odbc_, вы можете избежать создания нескольких соединенийобрабатывает и использует другой, если вам нужен другой набор результатов, пока первый активен.

...