Python flask:让数据库连接更高效

Python flask: make database connect more efficient

我在 Flask 中开发了一个基本的 Web 应用程序。在主页上,它有指向 3 条不同路线的链接,每条路线都指向一个单独的 html 页面,显示不同的结果。现在,结果是从 oracle 数据库表中获取的。代码结构如下所示。

@app.route('/route1')
def func1():
    connection = cx_Oracle.connect("myuser/mypass@oracle.sub.example.com:1521/ora1")
    \read from database into variable var1
    connection.commit()
    connection.close()
    return render_template('a.html', var = var1)

@app.route('/route2')
def func2():
    connection = cx_Oracle.connect("myuser/mypass@oracle.sub.example.com:1521/ora1")
    \read from database into variable var2
    connection.commit()
    connection.close()
    return render_template('b.html', var = var2)

@app.route('/route3')
def func3():
    connection = cx_Oracle.connect("myuser/mypass@oracle.sub.example.com:1521/ora1")
    \read from database into variable var3
    connection.commit()
    connection.close()
    return render_template('c.html', var = var3)

因此,我正在为每个新请求启动一个新连接。它工作正常,但有没有更有效的方法来实现它?每个用户一次只能请求一项服务(路线)。因此,理想情况下,每个用户应该有一个到数据库的连接。如何实施?或者有什么其他方法可以整体改善吗?该 webapp 应该供 40-50 人使用。

为每个请求连接到数据库并不是一个有效的解决方案。您需要建立一个连接池并将其用于所有请求(在线程之间共享一个连接池)。所以,这里线程安全是很有必要的。

为您的数据库驱动程序全局定义以下代码段(外部函数)并在函数内部使用它:

import cx_Oracle

# Create the session pool
pool = cx_Oracle.SessionPool(user="hr", password=userpwd,
                             dsn="dbhost.example.com/orclpdb1", min=2,
                             max=5, increment=1, encoding="UTF-8")

# Acquire a connection from the pool
connection = pool.acquire()

# your functions here 

有关池连接检查的详细信息here

您可能希望在创建 Flask 应用程序时建立连接数据库 connection/pool,并在您的所有路由中重复使用相同的 connection/pool。

作为单个连接

不建议这样做,因为多个请求需要等待连接。

app = Flask(__name__)

conn =   cx_Oracle.connect(
        'username',
        'password',
        'host',
        encoding="UTF-8")

@app.route("/")
def hello_world():
    # use conn
    return "<p>Hello, World!</p>"

@app.route("/test")
def hello_world():
    # use conn
    return "<p>Hello, World!</p>"

作为连接池

这是在 Web 应用程序中连接到数据库的首选方法


app = Flask(__name__)

pool = cx_Oracle.SessionPool(
    user='username',
    password='password',
    dsn='host',
    min=2,
    max=5,
    increment=1,
    encoding="UTF-8")


@app.route("/")
def hello_world():
    conn = pool.acquire()
    # use conn
    pool.release(conn)
    return "<p>Hello, World!</p>"


@app.route("/test")
def hello_world():
    conn = pool.acquire()
    # use conn
    pool.release(conn)
    return "<p>Hello, World!</p>"

来源:https://www.oracletutorial.com/python-oracle/connecting-to-oracle-database-in-python/


您可以使用 ORM 来简化和更好地构建您的应用程序。 SQLAlchemy does a great job and there is a wrapper to use SQLAlchemy with flask flask-sqlalchemy