PDA

Prikaži potpunu verziju : SQLite količina upisa


Neky
20.7.2012, 11:31
Zdravo drugari,

za potrebe aplikacije koju razvijam koristim sqlite bazu. Hteo sam da testiram kako se aplikacija ponaša sa 500 redova u bazi. Jedna for petlja unosi predmete u bazu, 125 u svakom izvršavanju.

Unesem 125 predmeta, sačekam 10 minuta za commit.
Promenim određene promenljive, unesem 125 predmeta, sačekam 10 minuta za commit.
Treći unos takođe prođe, sada imam 375 predmeta u bazi. Posle trećeg unosa sam sačekao 10 minuta za commit.

Kad probam 4. put da pustim petlju da odradi svoje, dobijem "Database is locked" i jedan .journal fajl pored same baze. Nakon toga više ne mogu da unesem ni ručno iz shella, ni iz aplikacije pojedinačno.

Da li postoji neko ograničenje? Da li da smanjim broj iteracije for petlje, ili da čekam malo duže za commit?

Neutrino
20.7.2012, 16:49
Nisi rekao koju tačno tehnologiju koristiš - PHP, ASP, Java? Takođe nisi naveo kakve tipove podataka unosiš u bazu i da li je bar neki od njih tipa BLOB.

Ako radiš na web aplikaciji koju pokreće PHP/ASP/Java itd. batali SQLite i pređi na MySQL/MSSQL/Postgre jer SQLite nije baš optimalno rešenje za slučajeve gde se traži velika konkurentnost (veliki broj upisa itd.)

Što se tiče greške koju dobijaš nastala je verovatno zato što je tokom upisa došlo do problema (.journal fajl je neka vrsta rollback sistema). Moja preporuka ti je svakako da upite nikad ne držiš u petljama već da konstruišeš string upita koji će sadržati sve unose i onda da serveru pošalješ samo taj jedan upit. Naravno ovo važi samo ako ne koristiš BLOB-ove mada i tada možeš da koristiš wrappere (recimo base64 enkodiranje).

Daj malo više detalja pa ću moći nešto konkretnije da ti kažem. Ako možeš da postaviš i kod koji koristiš kao i šemu tabele koju "puniš" još i bolje.

Neky
20.7.2012, 17:37
U PyQt sam uradio aplikaciju (nije baš web tehnologija, ali radi se o bazi podataka :) ). Svi tipovi podataka su string, osim jednog inta koji glumi boolean promenljivu.

Ta petlja je samo tu da mi popuni bazu za potrebe testa izdržljivosti i brzine, kako ne bih ručno unosio 17 promenljivih svaki put :)

Sad sam petlju ograničio na 50 iteracija svakih 20 minuta i dogurao do 200 redova u bazi, a na 300 redova obično počne da lockuje bazu...

Neutrino
20.7.2012, 17:55
Stvarno ne bi trebalo da bude problema sa upisom osim ako količina podataka koju unosiš nije ogromna.

Jesi li probao unos da osiguraš transakcijama?

http://www.sqlite.org/lang_transaction.html

Sa njima si bar siguran da će svaki uspešan unos biti comittovan a usput se isključuje i autocommit kojim ćeš možda malo rasteretiti upis. Nisam baš nešto preterano upoznat sa PyQT-om ali jesi li siguran da on ne unosi neko ograničenje? Jesi li probao da napraviš recimo bash skriptu koja će da simulira to što pokušavaš da uradiš preko shella?