Python2.7 中的 MySQL 连接池无法按预期工作。连接池的close()功能面临问题



我已经为MySQL连接池获取了python示例代码,并尝试使用django框架执行它。如果不关闭光标和连接对象,我就可以执行查询并检索数据。当我调用close((函数连接对象时,它失败了,并出现以下错误,请帮助我解决这个问题。

在/settings处编程错误1045(28000(:用户'root'@'localhost'的访问被拒绝(使用密码:NO(

方法:GET

请求URL:http://sample.app.com/settings

Django版本:1.11.5

异常类型:编程错误

异常值:1045(28000(:用户'root'@'localhost'的访问被拒绝(使用密码:NO(

异常位置:_auth_switch_request中的venv/local/lib/python2.7/site-packages/mysql/connector/connection.py,第256行Python可执行文件:venv/bin/python2

Python版本:2.7.17

我正在使用的代码,粗体编码正在创建问题。如果不关闭连接,则工作正常。当我关闭时,它不起作用,并抛出一个错误。

db_pool.py

import mysql.connector.pooling
dbconfig = {
"host":"127.0.0.1",
"port":"3306",
"user":"root",
"password":"root",
"database":"test",
}

class MySQLPool(object):
"""
create a pool when connect mysql.
"""
def __init__(self, host="127.0.0.1", port="3306", user="root",
password="root", database="test", pool_name="mypool",
pool_size=3):
res = {}
self._host = host
self._port = port
self._user = user
self._password = password
self._database = database
res["host"] = self._host
res["port"] = self._port
res["user"] = self._user
res["password"] = self._password
res["database"] = self._database
self.dbconfig = res
self.pool = self.create_pool(pool_name=pool_name, pool_size=pool_size)
def create_pool(self, pool_name="mypool", pool_size=3):
"""
Create a connection pool
"""
pool = mysql.connector.pooling.MySQLConnectionPool(
pool_name=pool_name,
pool_size=pool_size,
pool_reset_session=True,
**self.dbconfig)
return pool
> > def close(self, conn, cursor):
> > """ Here I'm facing issue, close is causing the issue. this close must release the connection object and add it to the connection pool. """
> >   cursor.close()
> >   conn.close()
def execute(self, sql, args=None, commit=False):
"""
Execute a sql
"""
# get connection form connection pool.
conn = self.pool.get_connection()
cursor = conn.cursor()
if args:
cursor.execute(sql, args)
else:
cursor.execute(sql)
if commit is True:
conn.commit()
self.close(conn, cursor)
return None
else:
res = cursor.fetchall()
self.close(conn, cursor)
return res

在另一个文件db_operation.py中使用上述代码

from db_pool import MySQLPool
def testing(request, bid, *args, **kwargs):
mysql_pool = MySQLPool()
query = "select * from test.table1;"
result = mysql_pool.execute(query)
print 'RESULT : ', result

请帮助我解决这个问题,或者分享任何正确使用连接池的最佳示例。提前谢谢。

我已经解决了这个问题。默认情况下,pool_reset_session设置为True,并将其修改为False。现在,它运行良好。

当pool_reset_session为true时,它将使用主机、用户和无密码的默认配置重置会话。根据我目前的数据库连接,没有密码是不允许的。因此,pool_reset_session引发了一个问题并解决了它

谢谢。

最新更新