imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование > Для профессионалов
Опции темы
Старый 14.07.2004, 20:31     # 1
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

Sheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царстве
когда следует использовать 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() и может его вообще не нужно вызывать?
__________________
убрано по просьбе администратора
Sheryld вне форума  
Старый 14.07.2004, 22:38     # 2
RaZEr
МОД-Оператор ЭВМ
 
Аватар для RaZEr
 
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343

RaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех Гуру
Цитата:
если я убираю закрытие соединения - то все просто летает, но позрастает траффик
Хмм, а чем обосновано уменьшение траффика при постоянных open-close?
RaZEr вне форума  
Старый 14.07.2004, 23:13     # 3
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

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

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

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

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

Код:
class User
{
   GetUserByUserId(userId)
   {
      //тут инкапсулируется получение из бд нужного юзера
   }
}
затем где-то в коде:
Код:
$user = new User();

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

если есть какие-то мысли, пишите.
__________________
убрано по просьбе администратора

Последний раз редактировалось Sheryld; 14.07.2004 в 23:21.
Sheryld вне форума  
Старый 14.07.2004, 23:32     # 4
Saruman
::VIP::
 
Аватар для Saruman
 
Регистрация: 12.11.2002
Адрес: Nicosia, Cyprus
Сообщения: 1 285

Saruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman ГуруSaruman Гуру
А смысл вообще использовать mysql_close? Если у тебя non-persisten link - то он сам закроется по выходу из скрипта. Если же постоянный - то его mysql_close все равно не закрывает. Так что я не вижу особого в этом смысла.
PS: кста, в мануале так и написано: "Using mysql_close() isn't usually necessary"
__________________
"If people only knew how hard I work to gain my mastery, it wouldn't seem so wonderful at all." Michelangelo Buonarroti
Saruman вне форума  
Старый 03.08.2004, 20:30     # 5
dacuan
Junior Member
 
Регистрация: 04.03.2004
Сообщения: 56

dacuan Путь к славе только начался
Sheryld
Чтобы работало быстрее, лучше создать специальный класс -- список пользователей, в котором будешь получать всех пользователей по какому-то принципу _одним_ запросом и заносить информацию в массив.
Так будет на порядок быстрее, чем делать множество мелких запросов, да и траффик (суммарный) уменьшится.
dacuan вне форума  
Старый 04.11.2005, 23:40     # 6
aoxyz_30330
Junior Member
 
Аватар для aoxyz_30330
 
Регистрация: 22.05.2004
Сообщения: 112

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

Код:
connect();

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

disconnect();
aoxyz_30330 вне форума  
Старый 02.12.2005, 15:10     # 7
holem
Guest
 
Сообщения: n/a

Цитата:
если я вызываю закрытие соединения, то через какое-то время(после нескольких тысяч итераций цикла) база не дает к ней обращаться
ещё бы.. мускул хоть и силён, но не безгранично.
Цитата:
я знаю, что если параметры функции mysql_connect такие же, что и в прошлый раз и есть живой реальный экземпляр соединения, то нового соединения к базе не будет, а вернется лишь новый ресурс.
Как раз здесь этого не происходит: вызывается закрытие соединения предполагает, что следующий мускул_коннект() будет устанавливать _новое_ соединение с базой. Следовательно, для каждой итерации устанавливается новое соединение с базой, действия с ней и закрытие соединения.
Не вижу никакого смысла открывать/закрывать соединение в функции.
Вариант aoxyz_30330 куда более рационален.
 
Старый 04.12.2005, 19:34     # 8
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

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

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

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

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

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


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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