30. oktober 2004 - 02:16Der er
19 kommentarer og 2 løsninger
Mysql og Red hat 9.0
Hej,
Jeg har lavet en application som opsamler data og indsætter data i den Mysql-database som leveres med Red hat 9.0(hvis man installere alle pakker:-) )
Det går også meget fint en rum tid - faktisk mellem 4 - 8 timer. Men pludselig opstår der problemer. Mysql-server lukker pludeslig forbindelsen - eller også sker der en fejl. Men umiddelbart kommer der ikke nogen fejl - jeg har udskrever mysql_error hver gang jeg indsætter noget i databasen. Jeg har faktisk efterhånden prøvet alt . og intet hjælper.
Jeg har også prøvet at kører commandoen "BEGIN" før jeg indsætter data, og "COMMIT" efter jeg har execute min sætning - men det virker heller ikke. Skal man bruge "BEGIN" og "COMMIT" når man forbinder fra c++?
Jeg bruger c++ til at indsætte data i databasen.
Jeg har også et andet spørgsmål. Jeg har installeret phpAdmin. I phpAdmin kan jeg se at nogle af mine tabeller har et overhed på omkring 10.00 bytes? Hvad betyder der - og kan det ikke have noget at gøre med det før omtalte? Det er som om overheadet bliver mindre jo flere data der kommer i database. Hvordan kan det være?
Det kan være at du glemmer at lukke dine connections. Dvs. at du på et tidspunkt for opbrugt mængden af tilladte connections. Prøv at se i /var/log/mysqld.log
Ja, lap har ret. Hvis du ikke benytter en pooled datasources eller lign. så bør du selv sørge for at åbne/lukke connections på forsvarlig vis. Hvis du med: "en forbindelse som jeg bruger hele vejen igennem", mener at programmet/tråden holder fast i en og samme connections i alle de timer, så bør du klart sørge for at åbne/lukke den efter hvert brug.
Nope - jeg indsætter data minimum 1 gang i sekundet. Og hvis jeg skulle lukke min forbindelse og oprette en forbindelse hver gang får det for langsomt!
Du er nød til at tage stilling til det, specielt når du benytter en connection direkte på den måde. Du kan eks. lave dit eget lille framework, bruge noget der allerede er lavet eller måske bare lave en factory-metode, som giver dig en ny connection, hvis der ikke allerede eksisterer en. Hvad er tilstanden på dit connection-object når det begynder at fejle? Ckeck på det og lav en ny hvis nødvendigt.
* connect og disconnect for hver query vil få performance til at gå i dørken
* acquire og release fra og til en connection pool hvor connection pool søger efter free fysisk connection forfra hver gang har jo ingen effekt da det vil være samme connetcion der bruges alligevel
* acquire og release fra og til en connection pool hvor connection pool søger efter free fysiskeconnection round robin vil distribuere load ud på N connections, således at hver connection for en lille "pause" - jeg nægter at tro på at det løser dette problem med unstable connection
Jeg tror dog at den connection laver enten en timeout eller løber tør for ressourcer på MySQL serveren.
Mit forslag vil derfor være at du disconnecter og connecter for hver X. query. Med 1 query per sekund vil X=300 betyde en disconnect og connect hver 5. minut.
Det kan du leve med performance mæssigt.
Og hvis min hypotese om timeout eller løbe tør for ressource er rigtig, så vil det løse problemet.
Okay - jeg har efterhånden fundet frem til hvor fejlen opstår. Når jeg kan få udskrevet fejlen. Og fejlen sider: "Lost connection to Mysql server during query".
Kan nogle fortælle mig om der bliver kastet en exception når dette sker, og hvordan jeg kan håndtere den så jeg kan blive ved med at indsætte data i databasen?
Ja, jeg tror faktisk slet ikke at det var mysql som gav problemer, men konverteringen fra row-> double da jeg hentede det ud af resultsættet.
Det virker i hvert fald fint nu.
Synes godt om
Ny brugerNybegynder
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.