[PHP/SQLite] Regelmatig lange tijd database locked errors

Pagina: 1
Acties:
  • 257 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 17-09 18:14
Ik heb een website gemaakt in PHP5 waarbij ik gebruik heb gemaakt van het Zend platform en een eenvoudige SQLite database waarbij ik gebruik heb gemaakt van Zend_Db_Adapter_Pdo_Sqlite voor de database toegang. Op mijn eigen PC (een Linux systeem) werkte het allemaal prima, maar op de webhost (ook een Linux systeem) werkt het niet altijd, of beter gezegd meestal niet. Ik krijg dan namelijk een Zend_Db_Statement_Exception met als bericht:
code:
1
'SQLSTATE[HY000]: General error: 5 database is locked'

Dit is niet altijd zo, soms doet hij het een uurtje wel, dan weer een uurtje niet.

Het probleem lijkt dus in het locking-systeem van SQLite te zitten, waarschijnlijk dat een bepaalde lock niet weer op tijd vrijgegeven wordt. Ik heb al geprobeerd of het helpt om als de database gelocked is deze opnieuw te uploaden vanaf mijn eigen systeem waar deze wel werkt, maar dat helpt niet. De locks zitten dus waarschijnlijk niet opgeslagen in het databasebestand zelf, maar ergens anders.

Een mogelijke oorzaak kan natuurlijk zijn dat, doordat de website op een multithreaded webserver draait waarbij er meerdere requests tegelijk afgehandeld moeten worden, een proces de database gelockt heeft als een ander proces deze ook nodig heeft. Echter worden er op de database normaliter alleen SELECT queries uitgevoerd (de pagina's zitten in de database opgeslagen en deze kunnen slechts aangepast worden door de beheerder) en in principe zou het lockingsysteem van SQLite hier prima mee om moeten kunnen gaan (zie hier voor meer info over het lockingsysteem).
Overigens leek het uitvoeren van beheertaken op de pagina's met als gevolg wijzigingen in de database op momenten dat deze niet gelocked was niet van invloed te zijn, ofwel ik kon rustig op momenten dat het werkte pagina's aanmaken / aanpassen / verwijderen.

Mijn probleem is dus dat de database gelocked wordt en waarschijnlijk niet weer geunlocked. Ik zou dan ook graag willen weten of iemand dit vaker meegemaakt heeft of misschien dat iemand weet waar dit aan kan liggen. Dit is namelijk ook mijn eerste project waarbij ik Zend_Db gebruik voor databasetoegang en tevens de eerste keer dat ik een SQLite database gebruik (andere RDBMS'en worden niet ondersteund door de host).

Misschien dat iemand weet hoe / waar de locks opgeslagen worden door SQLite zodat ik dat eens in de gaten kan houden? Of misschien dat SQLite een logboek bijhoud van de locks?

Acties:
  • 0 Henk 'm!

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 17-09 18:14
Niemand een mogelijke oplossing?

Ik heb ondertussen zelf ook al even verder gekeken, en de broncode van SQLite er even bij gepakt. In het bestand os.c staat de implementatie van de functies voor het openen van de bestanden en het lijkt gewoon via de standaard C functie open(...) te gaan waarbij de toegangsrechten / locking etc. via de flags als O_EXCL geregeld worden. Locking gebeurt dus blijkbaar op OS-niveau.

Omdat de host op Linux draait zou ik graag willen weten of het misschien mogelijk is of het probleem ergens bij het OS ligt (wat me sterk lijkt) of in de configuratie van de server. Is dat mogelijk het geval dan kan ik proberen contact op te nemen met de webhoster, en misschien dat zij er dan wat aan kunnen doen.

Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 19-09 09:59
Ik weet niet welke versie van PHP, en belangrijker, van SQLite, er bij je hoster gebruikt wordt?

Misschien is in de phpinfo ook te vinden met welke config opties SQLite gecompiled is.

En weet je zeker dat Apache (ik neem aan dat die gebruikt wordt) multithreaded draait?

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

sqlite is bedoeld als embedded database en is eigenlijk dus niet echt geschikt voor websites. Maar de meeste hosters bieden ook mysql databases aan. Overigens krijg je een melding 'database is locked' en niet 'file is locked/in use'. Het is dus sqllite zelf welke aangeeft dat de database gelocked is.

Volgens mij heeft FirebirdSql betere threading support, maar ben daar niet helemaal zeker van.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 17-09 18:14
PHP versie 5.2.3 en de SQLite library gebruikt door PDO_SQLite is versie 3.3.17.

Configuratie opties waar PHP mee gecompiled is:
code:
1
2
3
4
5
6
'./configure' '--with-apxs2=/usr/local/apache/bin/apxs' '--with-mysql=/usr/local/mysql' 
'--enable-ftp' '--with-gd=/usr' '--with-jpeg-dir=/usr' '--with-png' 
'--with-config-file-path=/usr/home/ws/lswtools/' '--enable-mbstring' 
'--with-freetype-dir=/usr/home/ws/lswtools/software/freetype-2.1.10/' '--with-zlib' 
'--with-openssl' '--with-zip' '--enable-memory-limit' '--enable-calendar' '--with-gdbm' 
'--enable-exif' '--with-mime-magic' '--enable-versioning' '--with-curl=/usr/lib/'

Voor zover ik kan zien staat er niets tussen over SQLite.

Of Apache multithreaded draait weet ik zo niet, misschien maar eens een mailtje naar de webhoster sturen en dat vragen.

Wel heb ik zojuist, toen de database even werkte, wat geprutst met pagina's aanmaken en aanpassen en dat ging allemaal prima. Waarschijnlijk wordt de lock dan ook niet veroorzaakt door UPDATE / DELETE / INSERT queries op de database, maar gewoon door SELECT queries of random ofzo ;(

MySQL biedt deze webhoster wel aan, maar dan alleen bij een duurder pakket. Deze webhoster zou ook niet mijn keus zijn, maar de website is voor een kennis en hij had de hosting al geregeld |:( Eventueel zal hij dan toch maar een duurder pakket moeten nemen of over stappen op een andere webhoster, maar daar moet ik dan eens met hem over praten.

Wel heb ik nog even verder gezocht in de SQLite broncode en het blijkt dat error 5 'database is locked' in de code bij return status SQLITE_BUSY hoort.

En met Firebird heb ik persoonlijk ook helemaal geen ervaring, maar moet dat niet ook ondersteund worden door PHP? Ik kan er in de info.php niets over terugvinden. Ook is er geen officiële Zend_Db_Adapter beschikbaar voor Firebird.

EDIT: Wel zie ik zojuist in de phpinfo staan: Thread Safety: Disabled. Misschien dat dit er iets mee te maken heeft?

[ Voor 3% gewijzigd door muksie op 07-01-2008 17:22 ]


Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 19-09 09:59
Zou kunnen, maar dan moet de webserver wel multithreaded draaien.

Kijk anders hier even naar: http://www.sqlite.org/faq.html#q6

Lees ook de vraag ervoor, en dan voornamelijk de laatste alinea. Die C-calls zijn ook beschikbaar binnen PHP. Kijk eens of dat iets uithaalt.

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

  • djiwie
  • Registratie: Februari 2002
  • Laatst online: 17-09 16:35

djiwie

Wie?

Zou het probleem veroorzaakt kunnen worden als de database op een NFS-filesystem staat? (Zie de faq waar zeroxcool naar verwijst, punt 5.)
Ik weet natuurlijk niet de specifieke hostsituatie van de TS, maar ik moest hier meteen aan denken met in het achterhoofd soortgelijke problemen van een soortgelijk databasepakket van een softwareleverancier uit Redmond... Daarbij heb je ook allerlei problemen als twee verschillende gebruikers (of webserverinstanties in dit geval) het bestand willen openen en het een het bestand voor de ander lockt.
Ook het feit dat je de database na een uur pas weer kunt benaderen doet mij eerder denken aan een locking probleem op filesystem niveau, een lock die niet gereleased wordt o.i.d. en daardoor nog een uur vastgehouden wordt... NFS staat tenslotte niet bekend om zijn goede locking features, en ik kan me voorstellen dat je hoster iets dergelijks gebruikt.

Acties:
  • 0 Henk 'm!

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 17-09 18:14
Ik heb het de webhoster gevraagd en het blijkt dat ze inderdaad een NFS-bestandssysteem gebruiken. Waarschijnlijk is dit dan ook de oorzaak. Ik zal dan ook moeten overschakelen op een ander hostingpakket (met ondersteuning voor MySQL) of een andere webhoster.
Pagina: 1