Re: how to get rid of BTreeContainer as global variable

Sanjay Rao <[email protected]>
Newsgroups gmane.comp.web.zope.zodb
Message-ID <[email protected]>
I am not using any connection. I just want a store to have large mapping in 
RAM. I chose BTreeContainer. I want to replace it with some non-persistent 
alternative class.

On Wednesday, 7 September 2016 17:58:09 UTC+5:30, Jason Madden wrote:
>
>
> > On Sep 7, 2016, at 06:56, Sanjay Rao <[email protected] <javascript:>> 
> wrote: 
> > 
> > Hi, 
> > 
> > I am using multiple objects of BTreeContainer 
> (zope.app.container.btree.BTreeContainer) to store global mapping data in 
> my application. 
>
> (Note that the code has moved to simply 
> zope.container.btree.BTreeContainer. The zope.app.container.btree name is 
> simply a backwards compatibility alias, new code should use 
> zope.container.btree directly.) 
>
> > Now with new ZODB(4.4) and ZEO(4.3),  my application randomly throws 
> following Error 
> > 
> > ConnectionStateError: Shouldn't load state for 
> baton.tpd.variants.VariantsRegistry 0x043155 when the connection is closed 
> > 
> > 
> > If I replace BTreeContainer with OOBTree, Is it a safe bet to get rid of 
> this problem ? 
>
> No. They're both persistent object types. 
>
> This problem occurs when using *any* persistent object outside the scope 
> of its connection. This was discussed in some detail in an email on Aug 24: 
>
> > Note, however, that that connection is not necessarily safe to use or 
> associated with the current thread. If you have a bug in your code that 
> allows a persistent object to leak between threads or outlive a transaction 
> boundary when the connection is closed, you can run into trouble. A faulty 
> cache, for example, can produce this situation, leaving you with 
> ConnectionStateErrors: 
> > 
> > py>> import ZODB, ZODB.DemoStorage, persistent, transaction 
> > py>> db = ZODB.DB(ZODB.DemoStorage.DemoStorage()) 
> > py>> conn = db.open() 
> > py>> plist = persistent.list.PersistentList() 
> > py>> conn.root()['key'] = plist 
> > # Note that there is no connection yet 
> > py>> plist._p_jar 
> > # After commit we have a connection 
> > py>> transaction.commit() 
> > py>> plist._p_jar 
> > <Connection at 10728bf30> 
> > # But we still have it after the connection is closed 
> > py>> conn.close() 
> > py>> plist._p_jar 
> > <Connection at 10728bf30> 
> > # And it is useless 
> > py>> plist.thing 
> > Traceback (most recent call last): 
> >   ... 
> > ConnectionStateError: Shouldn't load state for 
> persistent.list.PersistentList 0x316490b7e11981b6 when the connection is 
> closed 
> > py>> plist._p_jar.root() 
> > Traceback (most recent call last): 
> >   ... 
> > ConnectionStateError: The database connection is closed 
> > 
> > So I guess I'm just saying, be careful about the lifetime of your 
> persistent objects. 
>
> Other than a faulty cache, trying to use persistent objects as module 
> globals, or passing them up through WSGI middleware or pyramid tweens that 
> are "above" the connection/transaction management can cause this type of 
> error. 
>
> I think you'll find that the error isn't really "random," there's a 
> specific misuse of objects that gets you there. 
>
> Jason

-- 
You received this message because you are subscribed to the Google Groups "zodb" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.