首页 > 解决方案 > Python flask:让数据库连接更高效

问题描述

我在烧瓶中开发了一个基本的 webapp。在主页上,它有 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)

所以,我为每个新请求开始一个新的连接。它工作正常,但有没有更有效的方法来实现它?每个用户一次只能请求一项服务(路由)。因此,理想情况下,每个用户应该有一个到数据库的连接。那如何实施?或者有没有其他方法可以整体改善?该网络应用程序应该由 40-50 人使用。

标签: pythondatabaseflaskflask-sqlalchemycx-oracle

解决方案


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

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

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 

有关池连接的详细信息,请查看此处


推荐阅读