On Dec 13, 2007 10:47 AM, Michael Bayer <[EMAIL PROTECTED]> wrote: > > > > On Dec 13, 2007, at 9:55 AM, Allen Bierbaum wrote: > > > > > In my current application I am running a rather expensive query in a > > background thread, but then I need to use the results in the > > foreground thread. The object I find has a great deal of lazy > > evaluated properties that link it to several other mapped objects. As > > it stands now, the application is only following the lazy properties > > when it uses the object in the primary thread. The has multiple > > engines connected to multiple databases. I have a separate session > > for each database for each thread. (Note: right now I am doing this > > manually but I am debating whether I should be using something like > > SessionContext.) > > > > What I am worried about is that by querying the initial parent object > > in the background thread and then using it's lazy props in the > > foreground thread, I think SA is probably using the background session > > to evaluate these links. > > > > Is there a recommended way to deal with a situation like this? In > > other words, what is the recommended practice for moving, reusing > > objects from a session across multiple threads. Is there some way to > > remap the object and attach it to the foreground session? > > > > theres two general options here. the most appropriate way to move > the object between sessions is to use session.merge(). this will > create a copy of the object in the target session, which is returned, > leaving the old one unchanged, so that it can additionally be "merged" > elsewhere. > > as of version 0.4.1 we added a flag to merge called "dont_load" which > prevents merge() from reloading the instance from the database upon > merge (the classical behavior of this method is that it loads the > current data from the database which is merged with the given data). > so setting dont_load=True will prevent these loads from happening. we > also have some fairly important fixes to dont_load=True in the current > trunk which will be out in version 0.4.2, so if you are getting into > heavy merge() usage and you need to use the dont_load flag (which is > strictly for performance reasons), you might want to go on trunk for > awhile. > > The other option here is to move the object completely from the > background to the foreground session. to do this, you would expunge() > it from the background session, and then update() it into the target > session. this is a "simpler" operation than merge since nothing is > being copied. but youd want to ensure the objects youre moving werent > part of some larger collection thats still sitting in the background > session. > > hope this helps...
That helps. Thanks. I will try to start using merge along with SessionContext to fix up my threading issues. Thanks, Allen --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---