[MySQL] open/close

Pagina: 1
Acties:

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
Ik ben in php een klein CMS aan het maken, voor een kleine website.

Wat is het beste?

De connectie met MySQL openen en sluiten na iedere query, of de connectie de hele tijd open houden, en pas als de pagina volledig is geparst automatisch laten sluiten?

Ik heb nu optie 1 "gebouwd", maar volgens mij vertraagd dat de parsing meer, en zorgt het voor meer load, dan gewoon 1 keer een connectie openen en connectie te laten uitdoven als de pagina is geparst.

Hoewel dus in ieder boek altijd wordt gewezen dat je je connectie moet sluiten.

Omdat ik in de war ben kom ik het hier vragen.

(Omdat ik met een class werkt is het niet echt moeilijk om de werking te veranderen, maar ik heb voorlopig niks te query-en aan m'n database om te testen)

http://www.softfocus.be/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:26
Je connectie moet je sluiten, van zodra je ze voor een onbepaalde tijd niet meer nodig hebt.

Als jij ervoor kan zorgen dat je connectie t.a.t. na iedere request gesloten wordt, dan zou je imho ook optie 2 kunnen proberen.
In het geval van een webapp lijkt me dat zo geen probleem; ik bedoel: je connectie blijft slechts open gedurende de tijd van je request.
In Windows app's is dat dan weer wat anders.

https://fgheysels.github.io/


  • DrClaw
  • Registratie: November 2002
  • Laatst online: 15-10 14:49
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class MysqlDriver {
        private $_Link;
        private $_DBHost, $_DBUser, $_DBPass;

        public function __construct( $dbhost, $dbuser, $dbpass ) {
                $this->_Link = 0;
                $this->_DBHost = $dbhost;
                $this->_DBUser = $dbuser;
                $this->_DBPass = $dbpass;

                $this->reopen();
        }

        public function reopen() {
                if( $this->_Link != 0 )
                        return;
                $this->_Link = mysql_connect( $this->_DBHost, $this->_DBUser, $this->_DBPass, true ) or die
                        ( 'Error connecting to the MySQL database' );
        }

        public function __destruct() {
                $this->close();
        }

        public function close() {
                mysql_close( $this->_Link );
                $this->_Link = 0;
        }

        public function query( $query ) {
                return mysql_query( $query, $this->_Link );
        }

        public function db( $dbname ) {
                mysql_select_db( $dbname, $this->_Link );
                $this->_DBName = $dbname;
        }

        public function debuginfo() {
                echo "MysqlDriver debuginfo\n";
                echo "  Link: " . ( $this->_Link == 0 ? 'not connected' : 'connected (' . $this->_Link . ')' ) . "\n";
                echo "  Host: " . $this->_DBHost . "\n";
                echo "  User: " . $this->_DBUser . "\n";
                echo "  Pass: " . $this->_DBPass . "\n";
        }
}


hierme hoef je in principe niet meer na te denken of je m closed of niet. dat doet ie in principe automatisch, en als je lui bent dan open je m dus 1x aan het begin, en dan gaat ie automagisch dicht aan het eind van je programma.

Maar als je m toch wilt sluiten, dan kan dat ook. Echter, dan werken je queries niet meer :)

[ Voor 9% gewijzigd door DrClaw op 25-06-2008 12:02 ]


  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
Amaai, zo snel, en al meteen een brok code :p
Hoewel ik een heel andere aanpak had, kan ik er zeker uit leren, aangezien ik me nu pas echt begin bezig te houden met oop. (omdat ik het eindelijk snap, en het heerlijk werkt)

Dus je laat inderdaad gewoon de verbinding "uitdoven", maar je geeft ook de optie om deze expleciet te sluiten. (Eigenlijk kun je toch automatisch de connectie reopen indien deze gesloten was?)
(en welke methode is daarvoor de conventie? gebruik je __destruct of gebruik je close?)

(btw: host=linux/Devcomputer=OSX|geen window api dus)

[ Voor 13% gewijzigd door g4wx3 op 25-06-2008 12:30 ]

http://www.softfocus.be/


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Wat verstandig is heeft eigenlijk meer te maken met het aantal concurrent connecties welke mogelijk zijn en het aantal bezoekers welke je website concurrent trekt. Als het maximum aantal mysql connecties op 10 is gezet, kunnen dus ook maximaal 10 gebruikers tegelijkertijd een page opvragen als je de connectie tot het einde van de page open houd. De rest zal moeten wachten tot er een verbinding beschikbaar komt.

Door de verbinding direct te sluiten kun je 'meer' gelijktijdige bezoekers van dienst zijn. Voor de eerste 10 requests zal de laadtijd iets toenemen, maar bij de overige requests juist afnemen. Vrijwel alle webtalen hebben tegenwoordig connection pools waardoor bvb php wel de verbinding met de database openhoud, maar de connectie doorgeeft aan een ander request. Op die manier wordt de extra overhead van het opzetten en sluiten van een connectie voorkomen (tcp + mysql handschake)

Zolang de webserver minder requests verwerkt dat de database aan connecties accepteert, zul je in de praktijk geen verschil merken. Echter het afsluiten c.q. opruimen van gebruikte resources is wel een goede gewoonte om aan te leren.

If it isn't broken, fix it until it is..