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

g0czyy6m  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(455)

在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.") 有人有办法处理吗?
一种解决方案是为每个函数再次创建连接,但是为了性能,如果可能的话,我宁愿重用连接。

v1l68za4

v1l68za41#

我目前得到的解决方案包括 reconnect 每次方法都需要db连接。
我不知道这是否会使开销增加 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
pdsfdshx

pdsfdshx2#

您可以使用池: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

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

相关问题