[mysql] Teveel connecties

Pagina: 1
Acties:

  • XippIX
  • Registratie: Augustus 2001
  • Niet online
Ik heb een website met draaien met ongeveer 500 bezoekers per dag.
Het enigste probleem is dat mijn website offline is gehaald (althans de mysql server) omdat ik volgens de provider teveel connecties had openstaan die niet werden gesloten.

code:
1
2
3
4
5
6
     | User      | Host      | db        | Command | Time | State | Info | 
+---------+-----------+-----------+-----------+---------+------+-------+-------+ 
| 2951167 | hierdehost | localhost | command | Sleep   | 380  |       | NULL
| 2951335 | hierdehost | localhost | command | Sleep   | 170  |       | NULL 
| 2951383 | hierdehost | localhost | command | Sleep   | 244  |       | NULL
| 2951388 | hierdehost | localhost | command | Sleep   | 280  |       | NULL


Volgende die jongen waar ik mijn website host heeft het een load van 2.5
Volgens mij moet dit makkelijk kunnnen, maar hij zegt dat een load boven de 1 al veels te groot is. Dus wat kan ik hieraan doen?
De site bestaat uit ongeveer 1500 files. Ik kan dus ook niet zien waar de fout ligt, want het lijkt mij teveel werk om alle files door te kijken en deze te veranderen. Is er een andere oplossing? En is dit allemaal wel nodig?

Ik had laatst ook iets gelezen dat de provider deze openstaande connections ook gewoon zelf dmv een script kan sluiten. Klopt dit?

[ Voor 4% gewijzigd door XippIX op 04-05-2004 15:40 ]


  • sjoerdb2
  • Registratie: Juli 2001
  • Laatst online: 09-05-2025
Ik denk dat het ligt aan het gebruiken van mysql_pconnect() ergens? zonder die te sluiten?

Volgens mij is het wel zo dat de verbinding gemaakt met mysql_connect() automatisch wordt gesloten zodra script is afgelopen. Daar zou het dus niet aan moeten liggen.

Misschien eens wat code van je mysql class posten? (als je die gebruikt?)

  • XippIX
  • Registratie: Augustus 2001
  • Niet online
hier een stukje van een pconnect:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<? 

  @ $open_db = mysql_pconnect( "localhost", "user", "pass");
  if (!$open_db)  {
    die ( "Geen connectie met de database-server. Vette pech dus"); 
  }
  @ $use =  mysql_select_db( "databasenaam" );
  if (!$use) { echo "Kon geen contact leggen met de database";
               exit();
  }
  

?>

[ Voor 15% gewijzigd door XippIX op 04-05-2004 15:54 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

XippIX schreef op 04 mei 2004 @ 15:54:
hier een stukje van een pconnect:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<? 

  @ $open_db = mysql_pconnect( "localhost", "user", "pass");
  if (!$open_db)  {
    die ( "Geen connectie met de database-server. Vette pech dus"); 
  }
  @ $use =  mysql_select_db( "databasenaam" );
  if (!$use) { echo "Kon geen contact leggen met de database";
               exit();
  }
  

?>
Je moet je connecties ook closen met mysql_close(). Nou blijft de rotzooi gewoon open staan.

Dus sowieso de verbinding sluiten voor die exit, en onderaan ergens als je klaar bent met de database, dus eigenlijk overal waar je de pagina verlaat.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • XippIX
  • Registratie: Augustus 2001
  • Niet online
bedankt voor de tip, alleen hoe krijg ik hem dan sluitend hierboven? aangezien ik hier op een iets andere manier werk dan het voorbeeld op de php site

code:
1
2
3
4
5
6
7
8
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
   die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>

want ik maak geen gebruik van een variable. Sorry maar ben nog een beginner met mysql

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? 

  $open_db = mysql_pconnect( "localhost", "user", "pass");
  if (!$open_db)  {
    die ( "Geen connectie met de database-server. Vette pech dus"); 
  }
  $use =  mysql_select_db( "databasenaam" );
  if (!$use) { echo "Kon geen contact leggen met de database";
               mysql_close($open_db);
               exit();
  }
  //doe wat je met je database wil doen
  mysql_close($open_db);
  

?>

Zo bijvoorbeeld.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • T-h-i-j-s
  • Registratie: April 2000
  • Laatst online: 21-04 13:18

T-h-i-j-s

koffie? ja lekker :)

Uit de PHP documentatie:
mysql_pconnect() acts very much like mysql_connect() with two major differences.

First, when connecting, the function would first try to find a (persistent) link that's already open with the same host, username and password. If one is found, an identifier for it will be returned instead of opening a new connection.

Second, the connection to the SQL server will not be closed when the execution of the script ends. Instead, the link will remain open for future use (mysql_close() will not close links established by mysql_pconnect()).

Warning

Using persistent connections can require a bit of tuning of your Apache and MySQL configurations to ensure that you do not exceed the number of connections allowed by MySQL.

User Contributed Notes
mightye (at) mightye (dot) org
03-Feb-2004 10:19
Normally you do NOT want to use mysql_pconnect. This function is designed for environments which have a high overhead to connecting to the database. In a typical MySQL / Apache / PHP environment, Apache will create many child processes which lie in idle waiting for a web request to be assigned to them. Each of these child processes will open and hold its own MySQL connection. So if you have a MySQL server which has a limit of 50 connections, but Apache keeps more than 50 child processes running, each of these child processes can hold a connection to your MySQL server, even while they are idle (idle httpd child processes don't lend their MySQL connection to other httpd children, they hold their own). So even if you only have a few pages which actually connect to MySQL on a busy site, you can run out of connections, with all of them not actually being used.

In general use mysql_connect() for connecting to MySQL unless that connection takes a long time to establish.
Kortom:
Waarschijnlijk kun je het probleem oplossen door mysql_connect te gebruiken. Die verbinding wordt automagisch afgesloten bij het beeindigen van het script, alhoewel het geen kwaad kan om het zelf te doen op de geschikte plek. Al was het maar als goeie oefening in het schrijven van nette code :).
mysql_pconnect is nogal lastig om optimaal te gebruiken als je niet zelf de volledige controle over apache en mysql hebt en er meerdere websites draaien.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

Waarom pconnect() ?

Gebruik gewoon connect().. dan hoef je ook niet handmatig te sluiten, want dit gebeurt dan automatisch als de pagina is afgerond is.

[spuit 11] :P

[ Voor 6% gewijzigd door Bosmonster op 04-05-2004 16:14 ]


  • XippIX
  • Registratie: Augustus 2001
  • Niet online
hartelijk dank voor jullie verhelderende uitleg :)
ik heb wat aanpassing gemaakt in het script en 2/3 van de load is al weg. mijn dank
Pagina: 1