Avatar billede jette1 Nybegynder
15. december 2006 - 10:21 Der er 12 kommentarer og
1 løsning

Dilemma: Persistent connections og stored procedures?

Jeg arbejder på et website med der benytter mysql_pconnect og almindelige databaseforespørgsler. Nu vil jeg imidlertid igang med at benytte stored procedures i mysql og kalde dem fra php. Men mysql_query("call someprocedure()") virker ikke umiddelbart.

Jeg kan få det til at virke, ved at smide det fjerde parameter på mysql_pconnect:

mysql_pconnect("localhost","user","pass",65536)

Men hvis jeg gør det, kan jeg ikke længere lave almindelige forespørgsler.

Jeg har så kigget på mysqli, men den understøtter ikke persistent connections.

Så spørgsmålet er: Hvordan kan jeg fortsætte med at bruge persistent connections og afvikle både almindelige forespørgsler og stored procedures?
Avatar billede jette1 Nybegynder
15. december 2006 - 10:25 #1
Glemte lige at nævnte, at løsningen naturligvis ikke må gå på kompromis med performance. Jeg har tidligere forsøgt at benytte mysql_connect, men det var ingen success, og derfor er jeg ikke meget for at benytte mysqli.
Avatar billede fixxxer Nybegynder
15. december 2006 - 11:19 #2
Er du sikker på at performences bliver dårligere fordi du skifter til mysqli modulet?
Avatar billede fixxxer Nybegynder
15. december 2006 - 11:28 #3
Lidt forskellig læsning på mysqli og persistent

http://www.google.dk/search?q=mysqli+persistent&hl=da&lr=&start=10&sa=N
Avatar billede jette1 Nybegynder
15. december 2006 - 11:56 #4
Jeg er ikke klar over om performance bliver dårligere hvis jeg skifter fra mysql til mysqli uden persistent connections. Jeg har googlet en del (faktisk lige nøjagtig den søgning du foreslår), men synes ikke jeg har fundet en entydig konklusion...
Avatar billede onkel_satan Nybegynder
15. december 2006 - 12:17 #5
"Jeg er ikke klar over om performance bliver dårligere hvis jeg skifter fra mysql til mysqli uden persistent connections"
Det kan komme an på mange ting. Grunden til at vælge persisten connection er hvis arbejded (eller 'overhead' som man siger) med at oprette database forbindelsen er tung eller f.eks. sker meget ofte.
To ting jeg umiddelbart ville kigge på 1) er databasen på samme maskine som webserveren 2) er hårdt belastet er webserveren
Er begge to tilfældet ville jeg overveje persistent connection ellers ser jeg ingen grund til det. For funktions mæssigt vinder du ingen ting ved persisten connection det er kun performance. Tværdigmod kan du ende i uheldige situationer.
Avatar billede jette1 Nybegynder
15. december 2006 - 14:58 #6
Ja, databasen er på samme maskine og er til tider hårdt belastet.
Vil det sige at konklusionen er enten eller? Enten bruger jeg almindelige db-forespørgsler eller også skifter jeg det hele ud med stored procedures?

Jeg kan jo ikke gøre begge dele på én gang... medmindre jeg laver 2 forbindelser til hvert request, og det kan heller ikke være smart set med performance-øjne.

Hvad ville I gøre i denne situation?
Avatar billede onkel_satan Nybegynder
15. december 2006 - 17:35 #7
Syntes det lyder lidt mærkeligt at man ikke kan kalde begge typer queries med persisten connection. Men bortset fra det saa ville jeg nok benytte mig af none persistent connections til databasen.
Avatar billede jette1 Nybegynder
15. december 2006 - 19:41 #8
onkel_satan: Ja, du har ret det lyder mærkeligt... jeg har lige forsøgt igen, og nu virker det :-) Tak for hjælpen... der er point på vej til dig, hvis du lige smider et svar...
Avatar billede jette1 Nybegynder
16. december 2006 - 09:30 #9
Grunden til at det virkede for mig var at jeg afviklede en almindelig forespørgsel FØR en stored procedure. Hvis man vil afvikle en almindelig forespørgsel EFTER et kald til en stored procedure, skal man bruge mysql_free_result.
Avatar billede onkel_satan Nybegynder
16. december 2006 - 22:33 #10
Ok, kommer her.
Avatar billede jette1 Nybegynder
16. december 2006 - 23:49 #11
Min konklusion før var forkert... php og stored procedures er åbenbart ikke helt kompatible endnu, iht. diverse bug-reports (Google: "stored procedure" "Lost connection to MySQL server during query").

Hvis man vil være sikker på det virker, skal man undlade at returnere et resultat, men istedet give returværdierne til sessionsvariabler (i mysql) som man selecter efter proceduren er kaldt:

$q = mysql_query("call myprocedure()");
$q = mysql_query("select @val1, @val2");
$r = mysql_fetch_assoc($q);
osv...
Avatar billede jette1 Nybegynder
16. december 2006 - 23:49 #12
onkel_satan: Husk at markere 'Svar' inden du trykker 'Send' :-)
Avatar billede onkel_satan Nybegynder
17. december 2006 - 02:41 #13
hehe.. her kommer et svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester