He implementado mi aplicación de matraz en apache+mod_wsgi
Estoy usando el modo WSGI Daemon y tengo esta configuración en apache httpd.conf:
WSGIDaemonProcess flask_test user=apache group=apache threads=20
Para simplificar, digamos que para cada solicitud, necesito ejecutar una consulta para insertar datos en Oracle DataBase.
Entonces, en mi aplicación de matraz, he hecho algo como esto:
# DB.py import cx_Oracle class DB: def __init__(self, connection_string): self.conn = cx_Oracle.connect(connection_string, threaded=True) def insert(query): cur = self.conn.cursor() cur.execute(query) cur.close() self.conn.commit() # flask_app.py from flask import Flask, request, jsonify from DB import DB app = Flask(__name__) db = DB(connection_string) @app.route("/foo", methods=["POST"]) def foo(): post_data = request.get_json() # parse above data # create insert query with parsed data values db.insert(insert_processed_data_QUERY) # generate response return jsonify(response)Cuando inicio el servidor apache+mod_wsgi, se crea el objeto DB y se establece la conexión DB. Para todas las solicitudes entrantes, se utiliza el mismo objeto DB para ejecutar la consulta de inserción.
Hasta ahora esto funciona bien para mí. Sin embargo, mi preocupación es que si no hay solicitudes durante un largo período de tiempo, la conexión de la base de datos podría agotarse y mi aplicación no funcionará para una nueva solicitud cuando llegue.
He estado monitoreando mi aplicación y he observado que la conexión a la base de datos persiste durante horas y horas. Pero estoy bastante seguro de que podría agotarse si no hay una solicitud durante 2-3 días (?)
¿Cuál sería la forma correcta de garantizar que la conexión DB permanecerá abierta para siempre? (es decir, mientras el servidor apache se esté ejecutando)
Utilice un grupo en lugar de una conexión independiente. Cuando adquiere una conexión del grupo, verificará si la conexión ya no es válida y dispensará automáticamente una nueva. Así que necesitas algo como esto:
pool = cx_Oracle.SessionPool(user=user, password=password, dsn=dsn, min=1, max=2, increment=1)Luego, en su código, debe hacer lo siguiente:
with pool.acquire() as connection: # do what you need to do with the connection