IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Для профессионалов (http://www.imho.ws/forumdisplay.php?f=91)
-   -   когда следует использовать mysql_close() ? (http://www.imho.ws/showthread.php?t=64225)

Sheryld 14.07.2004 20:31

когда следует использовать mysql_close() ?
 
Вобщем, решил я написать свой простенький dal-компонент(точнее переписать) для доступа к mysql. понимаю, что есть PEAR, но всегда хочется иметь под рукой что-то легкое...

Ок. Сказано - сделано. Решил его потестировать, а заодно опробовать графический интерфейс прораммы MySqlAdministrator(там завлекательные графики и таблицы текущей нагрузки на сервер).

Создаю бд(myIsam). Заполняю ее данными. Но все это не суть важно, на самом деле.

Значит создал я следующий тест:

Код:

<?

for(int i=0; i<10000; i++)
{
  TestFunc();
}


function TestFunc()
{
  //создаем экземпляр моего класса
  //коннектимся и выбираем бд
  //выполняем запрос(берем все 8 записей)
 
  //парсим результат и выводи скажем первое поле

  //а тут внимание! вызываем функцию(моего класса, которая инкапсулирует закрытие соединения с бд!
}
?>

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

если я убираю закрытие соединения - то все просто летает, но позрастает траффик(это показывает MySqlAdministrator).

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

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

вобщем разъясните что не так с этим mysql_close() и может его вообще не нужно вызывать?

RaZEr 14.07.2004 22:38

Цитата:

если я убираю закрытие соединения - то все просто летает, но позрастает траффик
Хмм, а чем обосновано уменьшение траффика при постоянных open-close?

Sheryld 14.07.2004 23:13

а тем, что работает медленее, я имел ввиду траффик за определенное время(т.е. в единицу времени он меньше), а не вообще, т.е. нагрузка на сервер будет поменьше(?). вобщем я решил забить на close:) потому что внятного ответа пока не нашел.

p.s. к чему это все веду?!

а к тому, что я привык уже писать объектный код.

т.е. например:

Код:

class User
{
  GetUserByUserId(userId)
  {
      //тут инкапсулируется получение из бд нужного юзера
  }
}

затем где-то в коде:
Код:

$user = new User();

$user->GetUserByUserId(1);

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

если есть какие-то мысли, пишите.

Saruman 14.07.2004 23:32

А смысл вообще использовать mysql_close? Если у тебя non-persisten link - то он сам закроется по выходу из скрипта. Если же постоянный - то его mysql_close все равно не закрывает. Так что я не вижу особого в этом смысла.
PS: кста, в мануале так и написано: "Using mysql_close() isn't usually necessary"

dacuan 03.08.2004 20:30

Sheryld
Чтобы работало быстрее, лучше создать специальный класс -- список пользователей, в котором будешь получать всех пользователей по какому-то принципу _одним_ запросом и заносить информацию в массив.
Так будет на порядок быстрее, чем делать множество мелких запросов, да и траффик (суммарный) уменьшится.

aoxyz_30330 04.11.2005 23:40

а почему бы не сделать обйект connection, каторый не вклютчать v testfunc ... то есть приконнектица, потом выполнить цикл .... потом закрыт соединение .... то есть типа

Код:

connect();

for(int i=0; i<10000; i++)
{
  TestFunc();
}

disconnect();


holem 02.12.2005 15:10

Цитата:

если я вызываю закрытие соединения, то через какое-то время(после нескольких тысяч итераций цикла) база не дает к ней обращаться
ещё бы.. мускул хоть и силён, но не безгранично.
Цитата:

я знаю, что если параметры функции mysql_connect такие же, что и в прошлый раз и есть живой реальный экземпляр соединения, то нового соединения к базе не будет, а вернется лишь новый ресурс.
Как раз здесь этого не происходит: вызывается закрытие соединения предполагает, что следующий мускул_коннект() будет устанавливать _новое_ соединение с базой. Следовательно, для каждой итерации устанавливается новое соединение с базой, действия с ней и закрытие соединения.
Не вижу никакого смысла открывать/закрывать соединение в функции.
Вариант aoxyz_30330 куда более рационален.

Sheryld 04.12.2005 19:34

Вобщем, раз уж подняли эту тему снова, то давайте плдведем некий итог.

Как ты видишь, я как раз с этим не спорю(что после вызова mysql_close, соединение будет устанавливаться заново).

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

Хотя можно делать и так:

Код:

function foo()
{
  mysql_connect();
}

Без mysql_close(), если функция создания соединения используется с теми же аргументами, что и в первый раз, то новое соединение установлено не будет, а вернется ссылка на уже установленное соединение, но все же лучше передавать уже открытое соединение руками и проверять connection resource, скажем на null, просто лишний раз вызывать функцию mysql_connect хуже, чем не вызывать ее вовсе(проверно тестом).


Часовой пояс GMT +4, время: 22:58.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.