我正在使用带有mysql 5.6的flask 10.1。我想要一个连接池,其中各个请求可以抓取连接并并行插入数据。我认为应该运行的代码是这样的:
# !flask/bin/python
from flask import Flask, jsonify, abort, make_response, request, g
import mysql.connector
app = Flask(__name__)
db_user = "user"
db_pass = "pass"
db_url = "127.0.0.1"
@app.before_first_request
def before_first_request():
# configure the connection pool in the global object
g.cnx_pool = mysql.connector.pooling.MySQLConnectionPool(pool_name="name",
pool_size=10,
autocommit=True,
user=db_user,
password=db_pass,
host=db_url,
database='db')
@app.route('/log', methods=['POST'])
def log_data():
"""
Logs data
"""
cursor = g.cnx_pool.get_connection().cursor()
query = """INSERT INTO db.data (time,data) values (NOW(),%s)"""
cursor.execute(query, (request.get_data(),))
return make_response('', 200)
if __name__ == '__main__':
app.run(debug=True)
但是,我存储在g中的全局连接池对象似乎正在被清理。例如。当我调用其余的终点时,我看到:
Traceback (most recent call last):
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/myuser/sandboxes/myapp-server-logger/app.py", line 45, in log_user_data
cursor.execute(query, (username, request.get_data()))
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/mysql/connector/cursor.py", line 463, in execute
if self._have_unread_result():
File "/home/myuser/virtualenv/py2.7-myapp-server-logger/lib/python2.7/site-packages/mysql/connector/cursor.py", line 288, in _have_unread_result
return self._connection.unread_result
ReferenceError: weakly-referenced object no longer exists
我是新手,这是一种存储连接池对象的错误方法吗?
答案 0 :(得分:2)
事实证明,在使用游标之前,数据库连接正在被清理并返回到池中。使用游标时必须保持连接的范围。这似乎是mysql.connector python中的设计缺陷,并且游标应该保持对连接对象的强引用。
更改此行:
cursor = g.cnx_pool.get_connection().cursor()
到此
conn = g.cnx_pool.get_connection()
cursor = conn.cursor()
答案 1 :(得分:1)
您可以尝试这种方式,github
代码示例是:
app.config.update(
DEBUG=False,
MYSQL_DATABASE_HOST='10.95.130.***',
MYSQL_DATABASE_PORT=8899,
MYSQL_DATABASE_USER='root',
MYSQL_DATABASE_PASSWORD='******',
MYSQL_DATABASE_DB='flask',
MYSQL_USE_POOL=
{
#use = 0 no pool else use pool
"use":0,
# size is >=0, 0 is dynamic pool
"size":10,
#pool name
"name":"local",
},
)
mysql = MySQL()
mysql.init_app(app)