In general, instance initialization should always happen inside a
transaction. This will catch any updates you do to indices or other
variables.
The instance initialization code in Elephant only forces transactions
for subsets of initialization that use cursors, and which under BDB
would lead to deadlocks or other errors. This allows developers
flexibility in breaking up large initialization transactions but the
consequence is that the set of side effects of a default call to make-
instance are not atomic unless wrapped in a transaction.
Ian
On Jan 21, 2008, at 8:52 AM, Joubert Nel wrote:
On Mon, 2008-01-21 at 10:58 +0200, Alex Mizrahi wrote:
JN> I did some reading through the mailing list archives and the
Elephant
JN> manual, but cannot find a recommended way of counting the
number of
JN> persistent objects of a particular class.
JN> I have a method that works (using map-class) but this is way
too slow
JN> for my purposes.
JN> I did find some postings from Oct last year about this question
but no
JN> definitive answer it seams.
JN> Any advice?
as far as i know, most btree implementation do not have a fast way
to count
leafs -- you need to iterate through all of them.
in PostgreSQL (and i think in most relational databases like that)
query
"SELECT COUNT(*) FROM tree11" takes time proportional to number of
elements
in tree11.
of course it would be much faster to do "SELECT COUNT(*)" then
reading all
elements on Lisp side, but it will be flawed anyway.
Right, I'm used to doing "SELECT COUNT" SQL statements, which could be
on any kind of joins and is *very* fast in a relational database.
so, the advice would be to count this parameter yourself. for
example, make
btree class-name -> instance count. and update it in initialize-
instance
(you can move this functionality to some instance-counter-mixin
class), and
whereever you delete them..
This is a great suggestion.
Just to verify: the writes to the database from the initialize-
instance
method; will they occur atomically with the consing of the persistent
class (i.e. I don't need to explicitly wrap things into a
transaction)?
Joubert
_______________________________________________
elephant-devel site list
elephant-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/elephant-devel
_______________________________________________
elephant-devel site list
elephant-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/elephant-devel