mysql.connector.connect似乎没有通过函数的持久连接

时间:2018-09-25 07:51:35

标签: mysql flask mysql-connector-python

在Flask框架的python中使用mysql时,我遇到一些问题。我已经建立了一个函数(get_db())以在请求后连接到数据库,并为以后在同一请求中请求它的函数提供相同的连接。

import mysql.connector #mysql-connector-python==8.0.12

def get_db():
if 'db' not in g:
    try:
        click.echo("Trying to connect")
        cnx = mysql.connector.connect(user='stack', password='overflow',
                          host='127.0.0.1',
                          database=DB_NAME)
        g.db = cnx
        return g.db
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            click.echo("Connection failed! Check username and password")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            click.echo("Database does not exist")
        else:
            click.echo("Unknown error: {} ".format(err))
    else:
        cnx.close()
    # Connection to db cannot
    # be established.
    # click.echo("Will exit from database")
    exit(1)

click.echo("Using existing connection")
return g.db

在其他功能中,我像这样使用它:

(...)
cnx = get_db()
cursor = cnx.cursor()
(...)

使用数据库的第一个功能可以正常工作。然后,当另一个尝试连接cursor时失败,因为cnx没有连接:

raise errors.OperationalError("MySQL Connection not available.")

有人能解决这个问题吗?

一种解决方案是为每个功能再次创建连接,但是出于性能考虑,我宁愿重用连接。

2 个答案:

答案 0 :(得分:0)

我当前最终得到的解决方案在每次方法需要数据库连接时都涉及一个reconnect

我不知道这是否会获得connect()的开销,但它适合当前的用例。

代码如下:

def get_db():
if 'db' not in g:
    try:
        cnx = mysql.connector.connect(user='tom', password='jerry',
                          host='127.0.0.1',
                          database=DB_NAME)
        g.db = cnx
        click.echo("Returns new connection")
        return g.db
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            click.echo("Connection failed! Check username and password")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            click.echo("Database does not exist")
        else:
            click.echo("Unknown error: {} ".format(err))

cnx = g.db
cnx.reconnect() <--- Doing a reconnect each time
return cnx

答案 1 :(得分:0)

您可以使用缓冲池:https://dev.mysql.com/doc/connector-python/en/connector-python-connection-pooling.html

导入mysql.connector

conf = {"user":"username", "password":"*****", host="hostname"}
pool_cnc = mysql.connector.connect(pool_name="my_pool", **conf)

# Take one connection using the name of the pool:
cnc1 = mysql.connector.connect(pool_name = pool_cnc.pool_name)
cnc1.is_connected()

# Should output True

在给定的链接上,还有一个有关显式池连接的示例