如何在FlaskSQLAlchemy中启用连接池?

2024-09-28 22:18:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我将Flask-SqlAlchemy与MySQL数据库一起使用。最近我发现了一个错误:

sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1040, 'Too many connections')

经过一番挖掘,似乎我没有使用连接池。你知道吗

根据我的研究SQLALCHEMY_POOL_SIZE现在在v2.4中被弃用了,不应该再使用了。你知道吗

SQLAlchemy==1.3.7
Flask-SQLAlchemy==2.4.1

那么正确的方法是什么呢?你知道吗

配置

SQLALCHEMY_DATABASE_URI = 'mysql://root:PASSWORD@localhost/main_db'

SQLALCHEMY_BINDS = {
    'radius':        'mysql://root:PASSWORD@localhost/radius_db',
    'cache':         'mysql://root:PASSWORD@localhost/cache_db',
}

代码:

def make_app():
    app = Flask(__name__, template_folder="../templates")
    app.config.from_object(config)
    db.init_app(app)

app = my_fabric.make_app()

根据SqlAlchemy,我应该通过create_engine来实现这一点

engine = create_engine("mysql+pymysql://user:pw@host/db", pool_size=20, max_overflow=0))

但是炼金术应该把这个抽象出来。所以我不知道该怎么配置。你知道吗

更新:

我用两个进程运行uWSGI。你知道吗

我现在已将最大\u连接数增加到500。很难说我是否有高流量,但我16小时后的数据库统计显示:

mysql> show status like '%onn%';
+-------------------------------------------------------+---------------------+
| Variable_name                                         | Value               |
+-------------------------------------------------------+---------------------+
| Aborted_connects                                      | 5                   |
| Connection_errors_accept                              | 0                   |
| Connection_errors_internal                            | 0                   |
| Connection_errors_max_connections                     | 0                   |
| Connection_errors_peer_address                        | 0                   |
| Connection_errors_select                              | 0                   |
| Connection_errors_tcpwrap                             | 0                   |
| Connections                                           | 3897                |
| Locked_connects                                       | 0                   |
| Max_used_connections                                  | 167                 |
| Max_used_connections_time                             | 2019-11-29 00:11:51 |
| Mysqlx_connection_accept_errors                       | 0                   |
| Mysqlx_connection_errors                              | 0                   |
| Mysqlx_connections_accepted                           | 0                   |
| Mysqlx_connections_closed                             | 0                   |
| Mysqlx_connections_rejected                           | 0                   |
| Performance_schema_session_connect_attrs_longest_seen | 117                 |
| Performance_schema_session_connect_attrs_lost         | 0                   |
| Ssl_client_connects                                   | 0                   |
| Ssl_connect_renegotiates                              | 0                   |
| Ssl_finished_connects                                 | 0                   |
| Threads_connected                                     | 97                  |
+-------------------------------------------------------+---------------------+

以及

mysql> SHOW STATUS WHERE variable_name LIKE "Threads_%" OR variable_name = "Connections";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Connections       | 3896  |
| Threads_cached    | 8     |
| Threads_connected | 97    |
| Threads_created   | 365   |
| Threads_running   | 2     |
+-------------------+-------+

以及

mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 500   |
+-----------------+-------+
1 row in set (0.01 sec)

Tags: nameappflaskdbsqlalchemymysqlrootpassword
1条回答
网友
1楼 · 发布于 2024-09-28 22:18:58

您可以使用会话而不是连接

my_session = Session(engine)
results = my_session.execute(query)
my_session.close()

在创建引擎时,您可以设置

pool_recycle=60. 

(或者再高一点)。https://docs.sqlalchemy.org/en/13/core/pooling.html#pool-setting-recycle

并不是说这将完全解决您的问题,但我很少遇到使用此设置的问题。你知道吗

相关问题 更多 >