Краткое руководство

В одной из наших предыдущих статей мы писали о том, как использовать Python для создания пула базы данных MySQL. В этой статье мы хотели поговорить о том, как использовать шаблон проектирования Singleton для улучшения реализации пула базы данных MySQL.



Предварительные требования

В нашем обсуждении того, как реализовать шаблон проектирования Singleton в пуле баз данных MySQL, мы будем использовать классы Python, наследование и mysql-connector python. Если вы не знакомы с этими концепциями, пожалуйста, не стесняйтесь читать наши связанные статьи, ссылки на которые приведены выше.

Проблема

Чтобы понять, почему шаблон проектирования Singleton необходим для нашей программы Python, давайте взглянем на следующую структуру каталогов, которая будет использоваться для создания простого приложения.

project
| main.py
| 
|-- db
|     LectureDAO.py 
|     ObjectiveDAO.py
|     QuestionDAO.py
|     AnswerChoicesDAO.py
|     BaseDAO.py 
|     Database.py

Как видно из нашей структуры каталогов, у нас есть 4 разных объекта доступа к базе данных (DAO). Каждый DAO будет расширять класс BaseDAO. Ниже представлена ​​начальная часть файла BaseDAO.py.

# Imports
from db.Database import Database
class BaseDAO():
    def __init__(self):
      # Create an instance of the database pool.
      self.db = Database()
      self.db.pool_size =3
      
      # For testing purposes lets print out the db
      print(self.db) 
...

Каждый объект BaseDAO создает экземпляр Database() для доступа к данным. Поскольку все объекты DAO расширяют объект BaseDAO(), это будет означать, что каждый раз при создании экземпляра DAO будет создаваться новый экземпляр пула базы данных. Мы можем убедиться, что это так, запустив следующий код, присутствующий в main.py.

from db.AnswerChoicesDAO import AnswerChoicesDAO
from db.LectureDAO import LectureDAO
from db.ObjectiveDAO import ObjectiveDAO
from db.QuestionDAO import QuestionDAO
# Load the env variables needed for 
#   setting up the db
from dotenv import load_dotenv
load_dotenv()
def main():
    AnswerChoicesDAO()
    LectureDAO()
    ObjectiveDAO()
    QuestionDAO()
if __name__=="__main__":
    main()

Запуск этого кода дает следующий вывод терминала.

Заметили, что есть 4 разных объекта базы данных? Это означает, что каждый раз, когда мы создаем объект DAO, мы создаем новый пул базы данных. Напомним, что весь смысл наличия пула базы данных в первую очередь заключался в возможности повторного использования соединений, поэтому создание нового пула базы данных каждый раз, когда мы создаем объект DAO, сводит на нет всю цель создания пула!

Что такое синглтон

Как и его название, шаблон проектирования Singleton стремится гарантировать, что в любой момент времени существует только один экземпляр объекта. Шаблон Singleton работает следующим образом: когда вызывается класс для создания экземпляра объекта, проверьте, не существуют ли какие-либо предыдущие экземпляры объекта. Если он есть, верните его вызывающему коду. В противном случае создайте новый экземпляр объекта и верните его.

Добавление синглтона в пул базы данных

Мы можем превратить наш класс базы данных в Singleton, если наш класс Database расширит класс Singleton из этого сообщения о переполнении стека, воспроизведенного ниже.

# Code Adapted from: shorturl.at/jAH23
class Singleton(object):

    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'): 
            org = super(Singleton, cls)  
            cls._instance = org.__new__(cls, *args, **kw) 
        return cls._instance
class Database(Singleton): 
...

Хотя мы вернемся к обсуждению переполнения стека в отношении pythonic деталей этого класса, основная структура этого класса следует шаблону проектирования Singleton. Если есть экземпляр класса, верните его. В противном случае создайте новый экземпляр класса.

Теперь мы можем установить класс Singleton() в качестве суперкласса для нашего класса Database. Как только мы это сделаем и запустим тот же код, что и ранее, мы должны получить что-то похожее на то, что воспроизведено ниже.

Заметили, что теперь все объекты одинаковы? Это означает, что наш синглтон работает и создает только один экземпляр пула баз данных!

Заключение

В этой статье мы кратко обсудили, как использовать шаблон проектирования Singleton для улучшения использования пулов баз данных MySQL. Этот шаблон проектирования, несмотря на то, что его довольно легко реализовать, может иметь важные последствия для вашей программы!

Спасибо, что прочитали эту статью! Если вы рассматриваете возможность членства в Medium, рассмотрите возможность использования нашей партнерской ссылки. Использование нашей ссылки приведет к тому, что мы получим небольшую комиссию от вашей подписки! В качестве альтернативы, пожалуйста, оставьте нам чаевые, нажав на кнопку под этой историей! Мы очень ценим вашу поддержку!

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.