Avatar billede krukken Mester
30. oktober 2004 - 02:16 Der 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?
Avatar billede kama Nybegynder
30. oktober 2004 - 10:20 #1
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
Avatar billede krukken Mester
30. oktober 2004 - 10:59 #2
Det står intet i mysqld.log. Jeg opretter også kun en forbindelse som jeg bruger hele vejen igennem.
Avatar billede kama Nybegynder
30. oktober 2004 - 12:14 #3
Hvis der opstår en fejl i mysql, så skal vi finde noget log. Hvad med at prøve mysqladmin flush-logs - hjælper det?
Avatar billede lap Nybegynder
30. oktober 2004 - 12:40 #4
du bør nok lukke din forbindelse hver gang du har indsat data - hvis du har behov for at genstarte mysqld, så får du problemer.

Det er jo også tænkeligt, at der simpelthen går for lang tid uden aktivitet, så din pipe eller tcp-forbindelse timer ud?
Avatar billede kama Nybegynder
30. oktober 2004 - 14:23 #5
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.
Avatar billede krukken Mester
30. oktober 2004 - 14:25 #6
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!
Avatar billede kama Nybegynder
30. oktober 2004 - 14:39 #7
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.
Avatar billede krukken Mester
30. oktober 2004 - 14:41 #8
Kan du give mig et eksempel på det?
Avatar billede kama Nybegynder
30. oktober 2004 - 14:52 #9
Det er bare et pattern og jeg kender ikke meget c++. Her lidt pseudo/java-kode:

private class Connection {
    Connection c;

    private Connection(String URL){
        //kode
    }

    public static Connection createConnection(String URL) {
        if(null == c) { //eller andet check på dens eksistens
          c = new Connection(URL);
        }
        return c;
    }
}

public class ConnectionPool {
    public Connection getConnection(String name){
        Connection conn = Connection.createConnection(name);
    }
    //kode
}
Avatar billede arne_v Ekspert
30. oktober 2004 - 23:07 #10
Altså:

* 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.

BEGIN og COMMIT kræver InnoDB tabeller.
Avatar billede krukken Mester
30. oktober 2004 - 23:09 #11
InnoDB tabeller??
Avatar billede arne_v Ekspert
30. oktober 2004 - 23:11 #12
MySQL understøtter fler forskellige tabel typer.

Standard er MyISAM. Som er "fuld speed" tabel typen.

InnoDB understøtter transaktioner, foreign keys etc..
Avatar billede arne_v Ekspert
30. oktober 2004 - 23:12 #13
Avatar billede krukken Mester
30. oktober 2004 - 23:13 #14
Jeg bruger MyISAM - skal jeg så bruge COMMIT OG BEGIN?
Avatar billede arne_v Ekspert
30. oktober 2004 - 23:14 #15
Nej.

De har nemlig ingen effekt (jeg formoder dog at de ikke giver fejl).
Avatar billede krukken Mester
03. november 2004 - 22:00 #16
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?
Avatar billede arne_v Ekspert
06. november 2004 - 15:39 #17
Lyder som enten em query som tager meget lang tid og derfor giver en
timeout eller som en dårlig forbindelse til MySQL serveren.
Avatar billede arne_v Ekspert
06. november 2004 - 15:41 #18
Hvis du bruger MySQL C APY (msyql_query) så smider den ikke nogen exception
fordi det er et C API.

Men du kan vel teste på en retur værdi. Det største problem er vel hvad state
databasen er i efter den query som gik galt.
Avatar billede krukken Mester
13. november 2004 - 12:29 #19
Arne_v >> ligger du et svar?
Avatar billede arne_v Ekspert
13. november 2004 - 13:02 #20
ok

Kom du videre ?
Avatar billede krukken Mester
14. november 2004 - 10:45 #21
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.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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