On Tue, Feb 18, 2014 at 03:46:23PM -0800, Jeff Dairiki wrote:
> As a workaround, at app config time, right after create_engine is
> called, I execute a query (before there is a possibility of a
> multi-thread race.)  E.g.
> 
>     engine = sa.create_engine(...)
> 
>     # early query to force dialect.initialize()
>     engine.execute(sa.sql.select([1]))

Just in case anyone is using this workaround, (or Mike's
`engine.connect().close()`), a better/safer work-around is:

    engine = sa.create_engine(...)

    # early query to force dialect.initialize()
    conn = engine.connect()
    conn.invalidate()

We are running our app using uwsgi which performs the app
initialization (i.e. constructs the uwsgi app) in the master process
before forking the worker processes.  Calling just `conn.close()`
returns the initial connection to the connection pool.  That
connection is then inherited by each of the worker processes.  When
two workers try to use the connection simultaneously, sparks fly.

`.invalidate()` prevents the connection from be re-used by the pool.

Jeff

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to