AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 36828
Accepted
Juan Carlos Coto
Juan Carlos Coto
Asked: 2013-03-14 14:15:01 +0800 CST2013-03-14 14:15:01 +0800 CST 2013-03-14 14:15:01 +0800 CST

如何最好地将 SQLAlchemy 中的连接池用于 PgBouncer 事务级池?

  • 772

使用 SQLAlchemy 查询 PgBouncer 后面的 PostgreSQL 数据库,使用事务级池。

用于这种设置的最佳模式是什么?我应该使用一个每个进程ConnectionPool一个引擎,还是应该为每个请求创建一个引擎,并NullPool为它们中的每一个使用?我应该使用完全不同的模式吗?

非常感谢!让我知道是否需要更多信息,我会尽快更新。

postgresql python
  • 2 2 个回答
  • 17555 Views

2 个回答

  • Voted
  1. Best Answer
    zzzeek
    2013-03-15T10:41:32+08:002013-03-15T10:41:32+08:00

    使用 PGBouncer,您可能只想坚持使用 NullPool。在这种情况下,您可以跨子进程共享单个引擎,因为不会在子进程边界上传输套接字连接。但是您不能在此边界上共享任何引用 Connection 对象的内容,例如具有活动事务的 Session。但是,您绝对不想执行“每个请求的引擎”,引擎是一个昂贵的对象,它会在第一次看到特定数据库 URL 时积累大量有关特定数据库 URL 的信息。

    • 12
  2. eradman
    2015-10-15T22:59:42+08:002015-10-15T22:59:42+08:00

    设置应用程序名称

    如果您希望运行许多进程,您需要知道它们从哪里连接。PGBouncer 将使其对pg_stat_activity. 通过仔细设置所需application_name的信息来解决此问题:

    # Sets the application name for this connection in the form of
    #   application-name:user@host
    prog = os.path.basename(sys.argv[0]) or 'desjob'
    username = pwd.getpwuid (os.getuid ()).pw_name
    hostname = socket.gethostname().split(".")[0]·
    args.setdefault('connect_args', {'application_name': "%s:%s@%s" %
        (prog, username, hostname)})
    args.setdefault('isolation_level', "AUTOCOMMIT")
    engine = create_engine(url, **args)
    

    首选会话

    使用会话,因为来自 Engine 对象的请求可以产生并保持多个连接。连接到 Postgres 并不是很昂贵,而使用 PGBouncer 则更便宜。我将始终使用NullPool,以便您在 Postgres 中看到的唯一连接是实际使用的连接。

    from sqlalchemy.pool import Pool, NullPool
    engine = create_engine(uri, poolclass=NullPool)
    

    消除空闲事务

    如果您的意图是使用 PGBouncer 进行扩展,那么您必须避免让交易保持打开状态。为此,您需要autocommit 打开. 这对 SQLAlchemy 来说并不简单......可以在三个地方设置“自动提交”:

    psycopg2 自动提交

    conn = psycopg2.connect(uri)
    conn.autocommit = True
    

    假定是 unsafe 不安全的,因为 SQLAlchemy 需要知道下面发生了什么。

    会话自动提交

    Session = sessionmaker(bind=engine, autocommit=True)
    session = Session()
    

    这需要仔细、明确的处理:

    session.begin()
    session.execute(...)
    session.rollback()
    

    函数调用和异常处理非常困难,因为 begin()不能commit()嵌套:

    def A():
      session.begin()
      ...
      session.rollback()
    
    def B():
      session.begin()
      try:
          A() # error, already open
    

    在这种模式下 psycopg2autocommit似乎是False(默认)

    引擎自动提交

    在创建引擎时将引擎隔离模式设置为"AUTOCOMMIT"建立新的默认行为,可能不需要更改现有代码。

    engine = create_engine(uri, isolation_level="AUTOCOMMIT")
    

    在这种模式下 psycopg2autocommit似乎是True

    这里的主要问题是,保证代码块包装在事务中的唯一方法是手动发出语句:

    session.execute("BEGIN")
    #...
    session.execute("COMMIT")
    
    • 8

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve