BerkleyDB - wo verstecken sich DBTxn und DBCursor

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
AllesMeins
User
Beiträge: 63
Registriert: Donnerstag 20. November 2003, 13:45
Wohnort: Frankfurt/M.

Ich versuche mir gerade den Umgang mit Berkeley DB beizubringen und hatte auch schon einige kleinere Erfolge. Meine erste BTree-Datenbank steht, mein erstes Enviroment auch. Nun würde ich gerne mal mit dem Cursor-Objekt "rumspielen", nur muss ich gestehen, dass ich es schlicht und einfach nicht finde. Naiv wie ich bin, dachte ich, dass es sich genauso wie auch das Envireoment erzeugen lässt - also irgendwas wie:

Code: Alles auswählen

import bsddb3.db
x = bsddb3.db.DBCursor()
Aber das schlägt fehl - 'module' object has no attribute 'DBCursor'. Das selbe gilt für DBTxn. Nun ist die dazugehörige Dokumentation ja auch eher arm an Beispielen und enthält (soweit ich das sehe) auch keinen Hinweis darauf, dass man diese Klassen irgendwo anders suchen muss. Könnt ihr mir also helfen, wie das geht?

Python: 2.6.5
bsddb3-Version: 4.8.3
deets

Wie bei eigentlich jeder Datenbank holt man sich den Cursor ueber eine Verbindun - in deinem Fall wohl das Environment.

Die Doku ist da recht klar:

http://pybsddb.sourceforge.net/bsddb3.html

DB Methods

DB(dbEnv=None, flags=0)
Constructor. More info...

<snip/>

cursor(txn=None, flags=0)
Create a cursor on the DB and returns a DBCursor object. If a transaction is passed then the cursor can only be used within that transaction and you must be sure to close the cursor before commiting the transaction. More info...
deets

Und natuerlich auch

txn_begin(parent=None, flags=0)

fuer die gesuchte Transaktion.
AllesMeins
User
Beiträge: 63
Registriert: Donnerstag 20. November 2003, 13:45
Wohnort: Frankfurt/M.

Danke für die Aufklärung. Da habe ich mich wohl von der Tatsache blenden lassen, dass man DBEnv direkt anlegen lassen bzw. davon das in der Doku bei den entsprechenden Klassen selber nichts dazu steht, wie sie erzeugt werden müssen.
AllesMeins
User
Beiträge: 63
Registriert: Donnerstag 20. November 2003, 13:45
Wohnort: Frankfurt/M.

Okay, ich schiebe gerade mal die nächste Frage nach. Weit bin ich nämlich leider nicht gekommen:

Ich stehe jetzt vor dem Problem, dass set_cachesize() nicht funktioniert. Immer wenn ich versuche das zu nutzen, gibt mir Python einen Segmentation Fault zurück:

Code: Alles auswählen

import bsddb3.db

env = bsddb3.db.DBEnv()
env.open('/tmp/', bsddb3.db.DB_CREATE)
env.set_cachesize(0, 512*1024*1024)
Nutze ich das falsch? Oder woran könnte das sonst liegen? Die Größe des gewünschten Caches habe ich schon variiert, ohne Erfolg...
deets

Ich habe keine Ahnung von der Berkley-DB, aber die Doku von set_cachesize ist recht umfangreich:

http://pybsddb.sourceforge.net/api_c/db ... esize.html

Da steht unter anderem was von non-continuous und so krams.


Darf ich mal frage, warum du das ueberhaupt machen willst? Sowas ist doch ganz klar nen Tuning-Massnahme, und soweit ich das beurteilen kann, hast du noch nicht mal ein rollendes Dreirad ;)

Insgesamt muss ich sagen finde ich die API furchteinfloessend.. vielleicht waere eine ander Datenbank besser geeignet? Was ist denn deine Anwendung?
BlackJack

AllesMeins: Ich denke folgender Satz aus der Doku ist die Erklärung:
http://pybsddb.sourceforge.net/api_c/env_set_cachesize.html hat geschrieben:The DB_ENV->set_cachesize interface may be used only to configure Berkeley DB before the DB_ENV->open interface is called.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
vielleicht waere eine ander Datenbank besser geeignet?
Alternativen sind z.B. Redis und Tokyo Cabinet. Beide haben eine IMHO ziemlich klare API, für Redis gibt es auch einen ORM namens "Redisco" (wenn ich den Namen richtig im Kopf habe...).

Gruß, noisefloor
AllesMeins
User
Beiträge: 63
Registriert: Donnerstag 20. November 2003, 13:45
Wohnort: Frankfurt/M.

Danke für die Antworten... Leider ist set_cachesize() keine Tuning-Maßnahme. Zumindest soweit ich das verstehe. Wenn ich das nicht verwende, kann ich in einem Enviroment keine Datenbank öffnen, mit der Fehlermeldung das kein Memory-Pool festgelegt sei. Und was ich dazu gelesen habe, deutet daraufhin, dass ich ne cachesize angeben muss.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

in Python 2.x gibt es doch das Module "bsddb". Mal abgesehen davon, dass es nicht für Python 3 übernommen wurde - die API ist ziemlich simple im Vergleich zu der hier genommenen Lösung... Oder wo ist der Unterschied?

Gruß, noisefloor
AllesMeins
User
Beiträge: 63
Registriert: Donnerstag 20. November 2003, 13:45
Wohnort: Frankfurt/M.

Naja, der Unterschied ist halt, dass das alte rausfliegt. Und wenn ich mich jetzt da neu einarbeite, dann versuche ich schon das neue zu lernen.
Antworten