【问题标题】:How to reduce number of connections using SQLAlchemy + postgreSQL?如何使用 SQLAlchemy + postgreSQL 减少连接数?
【发布时间】:2013-03-07 23:34:06
【问题描述】:

我正在 heroku 上使用他们的 Postgres 插件和开发计划进行开发,该计划的连接限制为 20。我是python 的新手,这可能很简单,但我发现很难在不引起OperationalError: (OperationalError) FATAL: too many connections for role 的情况下抽象数据库连接。

目前我有databeam.py:

import os
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from settings import databaseSettings

class Db(object):
    def __init__(self):
        self.app = Flask(__name__)
        self.app.config.from_object(__name__)
        self.app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get('DATABASE_URL', databaseSettings())
        self.db = SQLAlchemy(self.app)

db = Db()

当我为页面创建控制器时,我会这样做:

import databeam

db = databeam.db
locations = databeam.locations

templateVars = db.db.session.query(locations).filter(locations.parent == 0).order_by(locations.order.asc()).all()

这确实产生了我想要的东西,但缓慢且有时会导致上面提到的错误。由于我来自php 背景,我对如何处理数据库连接有一定的想法(即像上面的示例),但我担心它不适合python

在一个地方抽象数据库连接然后在所有导入中使用相同的连接的正确方法是什么?

【问题讨论】:

    标签: python postgresql heroku sqlalchemy flask


    【解决方案1】:

    在 SQL Alchemy 中,您应该能够创建连接池。这个池是每个 Dyno 的池大小。在 Dev 和 Basic 计划中,因为您最多可以有 20 个,如果您运行 1 个 dyno,您可以将其设置为 20,如果您运行 2 个,则设置为 10,等等。要配置您的池,您可以设置引擎:

    engine = create_engine('postgresql://me@localhost/mydb',
                       pool_size=20, max_overflow=0)
    

    这会为您的数据库引擎设置一个池,然后您会自动从中提取。您也可以手动配置池,更多详细信息可以在 SQL Alchemy 的池指南中找到 - http://docs.sqlalchemy.org/en/latest/core/pooling.html

    【讨论】:

    • 我知道这是一个旧答案,但我很难找到这个细节,我认为你可以提供帮助。如果将池大小设置为 20,这是否意味着测功机只能同时处理 20 个请求(因为每个请求都使用数据库,因此从池中获取连接)?这似乎是一个巨大的瓶颈,所以我肯定误解了一些东西。救命!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多