On Mon, May 28, 2012 at 12:58 AM, Bradley Mclain
<bradley.james.mcl...@gmail.com> wrote:
> On Saturday, May 26, 2012 9:31:55 AM UTC+10, Michael Bayer wrote:
>>
>>
>> On May 24, 2012, at 11:28 PM, Bradley Mclain wrote:
>>
>> Hi,
>>
>> Currently working on a project that use SQL alchemy with mod_wsgi,
>>  webapp2 and prestans (python REST framework). The backend is Oracle XE
>> using cx_Oracle.
>>
>> What is the appropriate way to manage sessions in a multithreading app
>> such as this? Currently I have been following the guide found here to
>> implement a contextual/thread-local session.
>>
>>
>> scoped_session produces a session factory/proxy object which maintains a
>> single Session per thread, and as the guide indicates you can allow this
>> factory to automatically create a Session on first use, then at request end
>> time you do an unconditional remove() so that the scoped_session closes the
>> Session it may or may not be handling, and disposes of it.
>>
>>
>>
>> I have then made a session that is automatically cleaned up by the request
>> handler. The code for this looks something like:
>>
>> def dispatch(self):
>>     self.db_session = db.Session()
>>     super(BaseHandler, self).dispatch()
>>     self.db_session.close()
>>     db.Session.remove()
>>
>>
>> db.Session.remove() should be enough here, it calls close() for you.
>>
>>
>> However this doesn't seem to clean up all database connections as viewed
>> in netstat
>>
>>
>>
>> The Session uses an Engine as a source of connections.   The Engine is
>> introduced at http://docs.sqlalchemy.org/en/rel_0_7/core/engines.html .
>>  Intrinsic to its behavior is that it uses a small connection pool which by
>> default holds onto five connections out of the total accumulated.  Full
>> information on how this pooling is configured or disabled is
>> at http://docs.sqlalchemy.org/en/rel_0_7/core/pooling.html.
>>
>> and I get a connections exhausted error from Oracle XE after a certain
>> time of using the application. The same thing also happens when I use MySQL
>> as well.
>>
>>
>> one of the many options here is the "pool_recycle" option which places a
>> time limit on the age of connections.
>>
>>
>>
>> If I add a call to db.engine.dispose() after the handler has returned this
>> appears to fix the problem but the SQL Alchemy documentation indicates that
>> this is only for usage with dropped connections or in test suites.
>>
>>
>> I'm glad the documentation made clear that dispose() is not generally
>> appropriate, as the Engine is a factory/registry for connections, not a
>> connection itself.
>>
>>
> Thanks for confirming my apprehensions about using engine.dispose().
>
> So I gather it is just a matter of me tweaking the pool_recycle and
> pool_size options to something more appropriate for my application?
>
> Can you offer any guidance as to some appropriate values for a threaded REST
> application? Would pool_size be able to be quite small like 2 and
> pool_recycle something like 2 mins?
>
>

How many connections are alive when you get the "connections
exhausted" error? Is it more than "pool_size + max_overflow" (default
15)? Also, are you using multiple processes with mod_wsgi? If so,
remember that each process will have its own pool, so if you had 2
processes, you could have up to 30 connections open.

Simon

-- 
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to