【问题标题】:Is having a global database connection allowed in WSGI applications?WSGI 应用程序中是否允许全局数据库连接?
【发布时间】:2018-05-22 17:08:54
【问题描述】:

我需要在 Flask 中创建一个简单的项目。我不想使用 SQLAlchemy。在下面的代码 sn-p 中,连接到服务器的每个人都使用相同的连接对象,但对于每个请求,都会创建一个新的游标对象。我问这个是因为我以前从未以这种方式使用过 Python DB api。这是正确的吗?我应该为每个请求创建一个新的连接对象还是为每个请求或下面的方法使用相同的连接和游标对象。哪一个是正确的?

import mysql.connector
from flask import Flask, request
app = Flask(__name__)

try:
    con = mysql.connector.connect(user='root',password='',host='localhost',database='pywork')
except mysql.connector.Error as err:
    print("Something went wrong")

@app.route('/')
def home():
    cursor = con.cursor()
    cursor.execute("INSERT INTO table_name VALUES(NULL,'test record')")
    con.commit()
    cursor.close()
    return ""

【问题讨论】:

  • 在反映事务(如果可用)绑定到连接而不是游标之后,一旦每个请求的数据库命令需要一个事务以避免您的数据库,您可能应该为每个请求建立一个单独的连接处于不一致的状态。
  • @moooeeeep 是的,你是对的。迟早我们使用连接对象使用commit方法执行Sql查询。我没有想到这一点。感谢您的帮助。

标签: python flask wsgi python-db-api


【解决方案1】:

WSGI 应用程序可能由多个工作进程和线程提供服务。因此,您最终可能会有多个线程使用相同的连接。因此,您需要确定您的库的连接实现是否是线程安全的。查看文档,看看他们是否声称提供Level 2 thread safety

然后,您应该考虑在您的请求期间是否需要交易。如果你发现你需要事务(例如,请求发出多个数据库命令,它们之间的状态不一致或可能存在竞争条件),你应该使用不同的连接,因为事务总是连接范围的。请注意,某些数据库系统或配置不支持事务或不相互隔离单独的连接。

所以如果你共享一个连接,你应该假设你在 autocommit 开启的情况下工作(或者更好:实际这样做)。

【讨论】:

  • 我一直在计划使用 apache 部署这个应用程序。在这种情况下,连接对象将被所有人同时使用。
猜你喜欢
  • 2016-03-14
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多