On Oct 7, 2010, at 12:53 AM, Warwick Prince wrote:

> Hi Michael
> 
> I'm still having a couple of issues with the sessions, but I'm now starting 
> to suspect mysqlconnector..  
> 
> For completeness, could you please let me know if there is anything specific 
> I need to do to "close down" a session / connection / engine etc if I want to 
> completely release it.
> 
> I see session.close(), but that appears to be more about committing etc, and 
> I can't see anything specific I need to do to an engine etc.  Basically, I 
> just want to ensure that I'm doing everything correctly when I drop a session 
> and kill the thread that it was in.

close() releases any open connections to the connection pool, and since the 
pool has a limit, if you weren't returning things to the pool that would be 
apparent once the pool raises an error.

> 
> Also, If I'm NOT creating lots of sessions for short periods of time (i.e. 
> web services)  (which I'm not) do I need to consider pools for any specific 
> reason?  They appear to be more about scaling that sort of situation.  I'm 
> basically creating a session and hanging on to it - doing lots of queries, 
> updates etc with lots of commit/roll back, then dropping the session and 
> exiting some time later -- Is my interpretation of session use correct?

you pretty much dont need to consider pools at all, just create an engine, use 
it.   If you only use one connection at a time, the pool would only have one 
connection.



> 
> I'll play with other avenues of investigation before bringing the current 
> session issues to the table.  ;-)
> 
> Cheers
> Warwick
> 
> 
>> 
>> On Oct 6, 2010, at 6:46 AM, Warwick Prince wrote:
>> 
>>> 
>>> I can't quite get my head around the "scope" of sessionmaker() yet..  I've 
>>> tried putting Session = sessionmaker() as a global to the entire codebase 
>>> (works but has same problem)
>> 
>> do you mean scoped_session here ?  sessionmaker is just a constructor for a 
>> new Session.    It doesn't hold onto anything.
>> 
>> scoped_session OTOH is nothing more than a thread local variable.     
>> Background on this concept is available here:  
>> http://docs.python.org/library/threading.html#threading.local .    The 
>> remove() call removes the current thread local's context.   If your app were 
>> single threaded, you could replace it with a single Session object, where 
>> you just call close() instead of remove() - it wouldn't be very different.
>> 
>> Within the context of a multiprocess, single-threaded application, 
>> threading.local doesn't have any effect - there's just one thread.
>> 
>>> Importantly..  I can completely close all my processes and cold start my 
>>> code - and this error continues until I restart mySQL !  i.e. NO session 
>>> will work again, but I can do basic queries.  What the?!
>> 
>> I've seen this happen with PG when we are testing out two-phase 
>> transactions.    You might want to ask on some MySQL forums what queries you 
>> might do to look at current lock/transaction state.
>> 
>>> 
>>> BTW: It someone says "You should be using scoped_session.."  Please explain 
>>> how to have either more than one session in the same context (I use three 
>>> for a possible three different binds)
>> 
>> yeah I actually have an app with a couple of scoped sessions, since there 
>> are two different databases and operations generally proceed with one or the 
>> other.
>> 
>>> or how to create one session that I can bind to more than one engine, and 
>>> not have to know in advance all possible tables I might want to use on each 
>>> engine..  
>> 
>> If the table metadata is bound to an engine, then the session doesn't need 
>> to be bound.  I.e. if tables A, B, C on metadata X are bound to engine P, 
>> tables D, E, F on metadata Y are bound to engine Q, you just use the 
>> Session, and it will handle the two engines as needed.   
>> 
>> If you really want total control, using some ruleset that's not quite as 
>> simple as table->metadata->engine, you can subclass Session and override 
>> get_bind().   I've never recommended that to anyone, but I put it out there 
>> just to help de-mystify the situation.   Its just one call that takes in a 
>> mapper, returns an engine.  
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "sqlalchemy" group.
>> To post to this group, send email to sqlalch...@googlegroups.com.
>> To unsubscribe from this group, send email to 
>> sqlalchemy+unsubscr...@googlegroups.com.
>> For more options, visit this group at 
>> http://groups.google.com/group/sqlalchemy?hl=en.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalch...@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to