[Zope] storing persisten object in python dictionaries
Jürgen Herrmann
Juergen.Herrmann at XLhost.de
Thu Oct 26 10:13:41 EDT 2006
On Thu, October 26, 2006 16:03, Jürgen Herrmann wrote:
>
>
> On Thu, October 26, 2006 15:25, Jürgen Herrmann wrote:
>>
>> On Thu, October 26, 2006 15:00, Marco Bizzarri wrote:
>>> On 10/26/06, Jürgen Herrmann <Juergen.Herrmann at xlhost.de> wrote:
>>>>
>>>> On Thu, October 26, 2006 14:53, Marco Bizzarri wrote:
>>>> > Storing persistent object in object outside of ZODB can incur in the problem of passing
> object(s) between threads, and, therefore, passing one object which is related to a
> connection on the ZODB to another context with a different connection.
>>>
>>>> ok, this is probably the problem here, so would haveing a cache dict for each thread help?
> there are only about 50-100 containers so the memory overhead would be neglible compared to
> the performance gained.
>>>
>>> Yes, this should probably resolve your issue.
>>>
>> ok, just reimplemented my _classContainer(className) method as follows:
>>
>> def _classContainer(self, className):
>> """ return the instances folder for className """
>> thread = currentThread()
>> containerDict = getattr(thread, '_relClsContainerDict', None) if containerDict is None:
>> containerDict = {}
>> thread._relClsContainerDict = containerDict
>> container = containerDict.get(className, None)
>> if container is None:
>> container = self.unrestrictedTraverse(self._classContainerPath(className))
> containerDict[className] = container
>> return container
>>
>> it seems to work fine, all tests pass, though i have a somewhat bad feeliong of setting an
> attribute on the thread object directly.
>> comments?
>>
> uhm, ran some more tests, seems this works fine for the first thread but not for the others, i get
> an error when loading a framed page
> for example (obviously the browser sends two concurrent requests).
>
> the error is as follows:
> ...
> * Module Products.Relateable.Relateable, line 96, in relatedObjectIDs * Module
> ZODB.Connection, line 729, in setstate
>
> ConnectionStateError: Shouldn't load state for 0x010f98 when the connection is closed
>
> the above code can obvioulsy only work if there is exactly one single connection tied to one
> thread and it's not closed while the thread is alive.
>
> anybody have suggestions on how to tackle this?
>
> best regards, jürgen herrmann
seems i can answer my quesitons for myself today :)
i figured if it's a per-connection problem - why not store the dict
at the connection... the code now reads as follows:
def _classContainer(self, className):
""" return the instances folder for className """
conn = self._p_jar
containerDict = getattr(conn, '_relClsContainerDict', None)
if containerDict is None:
containerDict = {}
conn._relClsContainerDict = containerDict
container = containerDict.get(className, None)
if container is None:
container = self.unrestrictedTraverse(self._classContainerPath(className))
containerDict[className] = container
return container
we'll see if this throws up other problems...
best regards, jürgen herrmann
_______________________________________________________________________
>> XLhost.de - eXperts in Linux hosting <<
Jürgen Herrmann
Konrad Adenauer Allee 43, DE-93051 Regensburg
Fon: +49 (0)700 XLHOSTDE [0700 95467833]
Fax: +49 (0)721 151 463027
WEB: http://www.XLhost.de
More information about the Zope
mailing list