Avatar billede dsj Nybegynder
28. oktober 2003 - 15:53 Der er 9 kommentarer og
1 løsning

Database-problemer (MySQL) og timeout

Jeg har efterhånden en masse problemer med en server der kører mod en database. Hver klienter kommer ind på serveren indlæses data fra databasen og hver gang klienter forlader serveren, gemmes data.

Problemet er at databasen ofte er ret ustabil. Nogen gange er tabeller af andre delsystemer låst i for længere tid (10-60 sekunder), andre gange er databasen bare overbelastet eller helt nede.

Mit mål er at min server kan køre videre og evt. blot afvise klienter, hvis der er problemer med databasen. Her er problemet så: kan PreparedStatement.executeQuery() afbrydes, hvis det tager for lang tid, kan der sættes timeout på eller er man tvunget til at vente?

Samtidig leder jeg efter en connction-pool, som ikke er for stor og avanceret, men kan finde ud af at håndtere, hvis databasen er helt nede i f.eks. 5 minutter og derefter er tilgængelig igen; nogle links ville være rart.

Andre løsningsforslag, ideer ønskes desuden velkomne. Hvor normalt er det i større systemer, at delsystemerne skal håndtere database-problemer, hvis i forstår? Kan BGBanks systemer f.eks. tåle at alle databaser er utilgængelige i 5 minutter og hvad gør de evt?

Databasen hedder i øvrigt MySQL er er ikke just gearet til den stillede opgave, men alt for mange faktorer gør at et DBMS-skift ikke er muligt. Nogen der ved hvordan MySQL håndterer samtidighed i forbindelse med læsning og skrivning til tabeller?
Avatar billede arne_v Ekspert
28. oktober 2003 - 17:20 #1
Normalt antages det at databasen er der og kører.

Hvis ikke er det normalt med problemer.

Eksempel: Danske Banks problem i foråret !

Hvis du skal sætte timeout vil jeg formode at du skal sætte
en driver specific property i de properties du kan kalde
getConnection med.

Prøv at sætte property "timeout" til et antal millisekunder.

Hvis du kan leve med at tabe data hvis applikationen går
ned (det kan bankerne ikke), så kan du putte alle database
gem requests i en kø og så have en tråd der henter fra den
kø og skriver til databasen. Den tråd kan så godt være
bagefter så længe der er memory til køen.

Hvis du ikke kan leve med at tabe data ved applikations nedbrud,
så er det bedste formentlig bare at stoppe hvis databasen ikke kan
følge med.

At implementere noget med at gemme temporært i nogle flat files
vil hurtigt blive meget komplekst.

Jeg kan forstå at det at skifte database ikke e en option.

Er en MySQL database mere en mulighed ? I så fald kunne du
kigge på c-jdbc produktet !
Avatar billede arne_v Ekspert
28. oktober 2003 - 17:25 #2
Dú kan vælge og vrage mellem db connection pool.

Eksempel:

http://www.snaq.net/java/DBPool/
Avatar billede dsj Nybegynder
28. oktober 2003 - 22:39 #3
Jeg kan umiddelbart godt lide ideen med at gem requests lægges i en kø, som en tråd står og tæsker igennem. Mere kompliceret bliver det dog når klienter modtages. Klienten kan ikke komme ind på serveren før denne er logget ind og nogle data er indlæst fra databasen. Så skal der vel laves noget med at indgående klienter queues til deres data kan blive indlæst fra databasen.
Avatar billede arne_v Ekspert
28. oktober 2003 - 22:48 #4
Hvis du har en tråd per client så var det nok mest logisk at execute
load i den kontekst (den tråd kan jo alligevel ikke noget før data
er loadet) og nøjes med at queue save.

Hvis du har få tråde der servicerer mange klienter så kunne du lade
queue processoren både loade data og sende til client. SÅ er vo ovre i
noget command pattern.
Avatar billede dsj Nybegynder
28. oktober 2003 - 22:59 #5
der er få tråde til mange klienter...
Avatar billede arne_v Ekspert
29. oktober 2003 - 08:34 #6
Så overvej etcommand pattern der både lodaer og sender til brugere.
Avatar billede arne_v Ekspert
29. oktober 2003 - 08:35 #7
Nu er det jo mit indtryk at dine options med hensyn til hardware og
software er begrænsede, så følgende er nok kun af akademisk
interesse:
  http://www.theserverside.com/resources/article.jsp?l=DB_Break
Avatar billede dsj Nybegynder
29. oktober 2003 - 09:19 #8
Ja det var jo lige sagen :)
Avatar billede dsj Nybegynder
30. oktober 2003 - 13:48 #9
Hvis du vil have nogen point, må du jo lægge et svar... :)

Løsningen blev indtil videre at kompilere MySQL til at udnytte mere end én processer samt slå logging fra (MySQL oplyser at det forøger hastigheden med 3%). Problemet bestod primært i, at MySQL-serveren havde mere end 400 statements at se til i sekundet, men nu hvor den udnytter alle processorerne, ser det lidt pænere ud :)
Avatar billede arne_v Ekspert
30. oktober 2003 - 13:55 #10
ok
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
Kurser inden for grundlæggende programmering

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