Как часто я должен закрыть соединения с базой данных?

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

Я должен соединяться с базой данных, выполняя вызовы, затем закрываясь и повторяя этот процесс для каждой функции базы данных, которую я пишу?

Например, у меня есть следующая функция, которая захватывает переменную $db от инициализации моего приложения.

function get_all_sections()
{
    global $db;
    $sql = 'select * from sections'; 

    if (!$db->executeSQL($sql, $result))
    {
        throw new Exception($db->getDatabaseError());
        exit();
    }

    $sections = array();

    for ($i = 0; $i < $db->numberOfRows($result); $i++)
    {
        $sections[] = new Section($db->fetchArray($result, MYSQLI_ASSOC));
    }

    return $sections;
}

Было бы лучше, если бы я открылся, соединение затем закрыло его после того, как я выбрал строки? Это походит на большое количество соединений, которые открыты и закрыты.

6
задан mculp 13 January 2010 в 15:52
поделиться

5 ответов

Если у вас есть пул соединений на (http://en.wikipedia.org/wiki/Connection_pool), то вы можете перехватить новое соединение, когда оно вам нужно. КАК КАК, я бы сказал, что привык относиться к любому ресурсу как к "ограниченному", и если вы откроете ручку db, держите его как можно дольше.

5
ответ дан 8 December 2019 в 17:21
поделиться

Подключение к БД занимает ограниченное время. При подключении через доменную розетку или именную трубку это ничтожно мало, но может быть гораздо больше, если это сетевое соединение, или, что еще хуже, открытый Интернет. Оставьте его подключенным, по крайней мере, на весь срок действия запроса.

3
ответ дан 8 December 2019 в 17:21
поделиться

Я думаю, что стандартным способом является использование JVM Tool Interface (JVM TI) для записи агента с обратным вызовом запуска GC и регистрации времени из него (см. GetTime ). Обратите внимание, что событие Начало сбора мусора отправляется только для полных GC.

Образцы агентов JVM TI доступны в демонстрационном каталоге JDK 5,0 или JDK 6 загрузки. Техническая статья JVM Tool Interface (JVM TI): Как работают агенты ВМ - еще один очень хороший ресурс. Также см. Создание агента отладки и профилирования с помощью JVMTI .

-121--1284145-

Вам на самом деле не нужны библиотеки (например, jQuery) для этого:

if (element.className == "")
    element.removeAttribute('class');
-121--2337607-

Поскольку соединения PHP MySQL довольно легкие, вы, вероятно, в порядке, открывая и закрывая соединение, когда это необходимо. То же самое относится и к другим подключениям к базе данных, например к SQL Server, который имеет довольно большие подключения.

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

Когда возникают сомнения, соблюдайте золотое правило: не оптимизируйте преждевременно.

2
ответ дан 8 December 2019 в 17:21
поделиться

ulong (*) (bd_t *, int, char * []) - тип функции, которая принимает указатель на bd _ t , int и указатель на массив char и возвращает ulong .

Код вызывает addr к такой функции, а затем вызывает ее с bd , -argc и & argv [1] в качестве параметров и присваивает результат rc .

-121--2875612-

Да, это вызов функции.

Значение в addr передается указателю функции, который принимает (bd_t *, int, char * []) в качестве аргументов и возвращает ulong и вызывает функцию. Он может быть поглощен:

typedef ulong (*bd_function)(bd_t *bd, int argc, char *argv[]);

bd_function bdfunc = (bd_function) addr;

rc = bdfunc(bd, --argc, &argv[1]);

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

-121--2875609-

Самым простым решением было бы использование mysql_pconnect () - см. здесь

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

1
ответ дан 8 December 2019 в 17:21
поделиться

Использование MySQL_PCONNECT для объединения соединения и закрыть в конце каждой операции. Нить не будет на самом деле закроется, а поток будет повторно использован. Таким образом, это как безопасно, так и эффективно.

3
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: