per those docs callTimeout is new as of oracle client 18c , that's extremely new. i run everything from the 11g rpm still. On Thu, Oct 25, 2018 at 8:49 AM Simon King <si...@simonking.org.uk> wrote: > > On Thu, Oct 25, 2018 at 12:50 PM Sebastian Meinhardt > <seb.meinha...@gmail.com> wrote: > > > > Our database environment drops idle connections after an hour. My > > application uses the SQLAlchemy connection pool to deal with this. The > > problem is: When a connection is closed, it takes the pool a real long time > > (15-20 minutes) to recover. This happens with both strategies, > > pool_pre_ping and pool_recylce. Apparently, the pool hangs when trying to > > operate on the already dead connections. > > > > Here is an excerpt from the logs. Look at the timestamps! > > > > With pool_pre_ping: > > > > 2018-10-25 12:30:38,866:DEBUG:Connection <cx_Oracle.Connection to > > USER@DATABASE> checked out from pool > > 2018-10-25 12:30:38,868:DEBUG:Pool pre-ping on connection > > <cx_Oracle.Connection to USER@DATABASE> > > 2018-10-25 12:46:26,624:DEBUG:Pool pre-ping on connection > > <cx_Oracle.Connection to USER@DATABASE> failed, will invalidate pool > > 2018-10-25 12:46:26,626:INFO:Disconnection detected on checkout, > > invalidating all pooled connections prior to current timestamp (reason: > > InvalidatePoolError()) > > > > > > With pool_recycle: > > > > 2018-10-25 12:40:51,869:INFO:Connection <cx_Oracle.Connection to > > USER@DATABASE> exceeded timeout; recycling > > 2018-10-25 12:40:51,871:DEBUG:Closing connection <cx_Oracle.Connection to > > USER@DATABASE> > > 2018-10-25 12:56:39,493:ERROR:Exception closing connection > > <cx_Oracle.Connection to USER@DATABASE> > > Traceback (most recent call last): > > File "/usr/local/lib/python3.6/site-packages/sqlalchemy/pool.py", line > > 314, in _close_connection > > self._dialect.do_close(connection) > > File > > "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line > > 465, in do_close > > dbapi_connection.close() > > cx_Oracle.OperationalError: ORA-03113: end-of-file on communication channel > > Process ID: 0 > > Session ID: 540 Serial number: 46277 > > 2018-10-25 12:56:39,674:DEBUG:Created new connection <cx_Oracle.Connection > > to USER@DATABASE> > > > > > > As this is an interactive application, I cannot let the user wait for 16 > > minutes. While I could implement an application side timeout that creates a > > new pool every 59 minutes, it feels like that would be missing the point. > > Is there an SQLAlchemy solution to my problem? Decrease the timeout on > > ping/close? Recycle connections in a background threads? Am I doing > > something fundamentally wrong here? > > > > Here's how SQLAlchemy pings the database: > > https://bitbucket.org/zzzeek/sqlalchemy/src/580d114405f3d200682f3a219dcb9004c81300c7/lib/sqlalchemy/pool/base.py?at=master&fileviewer=file-view-default#base.py-767 > > if pool._pre_ping: > if fairy._echo: > pool.logger.debug( > "Pool pre-ping on connection %s", > fairy.connection) > > result = pool._dialect.do_ping(fairy.connection) > # <-- this is apparently taking 16 minutes > if not result: > if fairy._echo: > pool.logger.debug( > "Pool pre-ping on connection %s failed, " > "will invalidate pool", fairy.connection) > raise exc.InvalidatePoolError() > > https://bitbucket.org/zzzeek/sqlalchemy/src/580d114405f3d200682f3a219dcb9004c81300c7/lib/sqlalchemy/engine/default.py?at=master&fileviewer=file-view-default#default.py-471 > > def do_ping(self, dbapi_connection): > cursor = None > try: > cursor = dbapi_connection.cursor() > try: > cursor.execute(self._dialect_specific_select_one) > finally: > cursor.close() > except self.dbapi.Error as err: > if self.is_disconnect(err, dbapi_connection, cursor): > return False > else: > raise > else: > return True > > So the first question is: do you see this 15-20 minute timeout with a > plain DBAPI connection? From a python prompt, create a cx_Oracle > connection, then kill the connection from the DB side (or wait an > hour). Then try to create a cursor and execute a trivial query. > > If it takes a very long time to return, you need a DBAPI-level fix. > The cx_Oracle docs suggest there is a configurable timeout parameter > (https://cx-oracle.readthedocs.io/en/latest/connection.html#Connection.callTimeout). > > If it fails immediately, repeat the experiment using an SQLAlchemy engine. > > Let us know how you get on, > > Simon > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > 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 https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout.
-- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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 https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.