database.py 文件源码

python
阅读 25 收藏 0 点赞 0 评论 0

项目:raw-data-repository 作者: all-of-us 项目源码 文件源码
def _ping_connection(connection, branch):
  """Makes sure connections are alive before trying to use them.

  Copied from SQLAlchemy 1.1 docs:
  http://docs.sqlalchemy.org/en/rel_1_1/core/pooling.html#disconnect-handling-pessimistic
  TODO(DA-321) Once SQLAlchemy v1.2 is out of development and released, switch to
  create_engine(pool_pre_ping=True).
  """
  if branch:
    # "branch" refers to a sub-connection of a connection,
    # we don't want to bother pinging on these.
    return

  # turn off "close with result".  This flag is only used with
  # "connectionless" execution, otherwise will be False in any case
  save_should_close_with_result = connection.should_close_with_result
  connection.should_close_with_result = False

  try:
    # run a SELECT 1.   use a core select() so that
    # the SELECT of a scalar value without a table is
    # appropriately formatted for the backend
    connection.scalar(select([1]))
  except DBAPIError as err:
    # catch SQLAlchemy's DBAPIError, which is a wrapper
    # for the DBAPI's exception.  It includes a .connection_invalidated
    # attribute which specifies if this connection is a "disconnect"
    # condition, which is based on inspection of the original exception
    # by the dialect in use.
    logging.warning('Database connection ping failed.', exc_info=True)
    if err.connection_invalidated:
      # run the same SELECT again - the connection will re-validate
      # itself and establish a new connection.  The disconnect detection
      # here also causes the whole connection pool to be invalidated
      # so that all stale connections are discarded.
      logging.warning('Database connection invalidated, reconnecting.')
      connection.scalar(select([1]))
    else:
      raise
  finally:
    # restore "close with result"
    connection.should_close_with_result = save_should_close_with_result
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号