MySQL пул соединений в Python2 .7 не работает должным образом. Возникла проблема с функцией close () пула соединений - PullRequest
0 голосов
/ 01 апреля 2020

Я взял пример кода python для MySQL пула соединений и попытался выполнить его с django framework. Я могу выполнить запросы и получить данные, если я не закрываю курсор и объект соединения. Когда я вызываю объект соединения функции close (), происходит сбой со следующей ошибкой. Пожалуйста, помогите мне решить эту проблему.

ProgrammingError at / settings 1045 (28000): доступ запрещен для пользователя 'root '@' localhost '(используя пароль: НЕТ)

Метод: GET

URL запроса: http://sample.app.com/settings

Django Версия: 1.11.5

Тип исключения: ProgrammingError

Значение исключения: 1045 (28000): доступ запрещен для пользователя 'root' @ 'localhost' (используется пароль: NO)

Местоположение исключения: venv / local / lib / python2 .7 / site-packages / mysql / connector / connection.py в _auth_switch_request, строка 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

Пожалуйста, помогите мне решить эту проблему или поделитесь лучшими примерами правильного использования пула соединений. Заранее спасибо.

1 Ответ

1 голос
/ 02 апреля 2020

Я решил эту проблему. По умолчанию для pool_reset_session задано значение True и для него установлено значение False. Теперь все работает нормально.

Когда pool_reset_session имеет значение true, он сбрасывает сеанс с настройками по умолчанию для хоста, пользователя и без пароля. Согласно моему текущему соединению с БД, оно не позволит без пароля. Итак, pool_reset_session вызвал проблему и решил ее.

Спасибо.

...