On 5/12/15 9:34 AM, Jonathon Nelson wrote:
I'm working on an application where I want to use one and only one connection, even in the face of errors. Originally I used AssertionPool, but it seemed to misbehave sometimes in the face of a disconnection.
Switching to QueuePool, I somewhat surprisingly got the same result.

This is how I perform my test. Using the code below, I start it with a URI and wait for it to tell me to stop postgresql, which I then do.
I hit enter, and get an (expected) error as it fails to connect.
When I hit enter a second time, I get an *unexpected* traceback, a different one for QueuePool as for AssertionPool, but unexpected nonetheless.
it would be super helpful if you could share what this traceback is.

send both tracebacks, because "it fails to connect" is also not expected - the connection is already pooled so it should be a stale connection error.



If I up the pool_size to 2, everything works fine but it leaves open the possibility of having more than one connection.



#! /usr/bin/python
import sys
import sqlalchemy as sa

def handle_checkout_event(dbapi_con, con_record, con_proxy):
    try:
        with dbapi_con.cursor() as cur:
            cur.execute("SELECT 1")
            cur.fetchone()
    except Exception, e:
        raise sa.exc.DisconnectionError()

def main():
    uri = sys.argv[1]
    #engine = sa.create_engine(uri, poolclass=sa.pool.AssertionPool)
engine = sa.create_engine(uri, pool_size=1, max_overflow=0, pool_timeout=0, pool_recycle=3600)
    sa.event.listen(engine, 'checkout', handle_checkout_event)

    with engine.begin() as conn:
        pass
    print "Now stop PG."
    raw_input('-=>')

    # should get an operational error
    try:
        with engine.begin() as conn:
            pass
        raw_input('-=>')
    except sa.exc.OperationalError, e:
        print >>sys.stderr, "Got an (expected) error: ", e

    raw_input('-=!')

    # *should* get the same thing.
    try:
        with engine.begin() as conn:
            pass
        raw_input('-=>')
    except sa.exc.OperationalError, e:
        print >>sys.stderr, "Got an (expected) error: ", e

    print "We never get here."
    raw_input('-=!')



if __name__ == '__main__':
    main()

--
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 <mailto:sqlalchemy+unsubscr...@googlegroups.com>. To post to this group, send email to sqlalchemy@googlegroups.com <mailto:sqlalchemy@googlegroups.com>.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

--
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/d/optout.

Reply via email to