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
我在 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