2014-02-08 1 views
0

У меня есть класс Model, который является частью моей самодельной ORM. Он имеет все виды методов, таких как save(), create() и так далее. Теперь дело в том, что для всех этих методов объект соединения должен действовать правильно. И я не знаю, как лучше всего подобрать объект Model с объектом соединения.Получение объекта связи в классе общей модели

То, что я хотя до сих пор:

  • обеспечивают объект соединения в Model «s __init__(); это будет работать, установив переменную экземпляра и используя ее во всех методах, но это приведет к нарушению API; пользователи не должны всегда комбинировать объект соединения при создании объекта Model;
  • создайте объект подключения отдельно, сохраните его где-нибудь (где?) И на Model__init__() получите соединение от того места, где оно было сохранено, и поместите его в переменную экземпляра (это то, что я считаю лучшим выбором, но не имеют представления о лучшем месте для хранения этого объекта соединения);
  • создать пул соединений, который будет питаться вместе с объектом соединения, а затем на Model__init__() выберите соединение из пула соединений (как узнать, какое соединение вызывается из пула?).

Если есть какие-либо другие вопросы, пожалуйста, сообщите. Кроме того, я хотел бы знать, что является правильным способом.

ответ

1

Вот как я хотел бы сделать:

  • Использование пула соединений с интерфейсом очереди. Вам не нужно выбирать объект соединения, вы просто выбираете следующий на линии. Это можно сделать всякий раз, когда вам нужна транзакция, и возвращать ее потом.

  • Если у вас нет особых требований, я бы использовал класс Singleton для подключения к базе данных. Нет необходимости передавать параметры в конструкторе каждый раз.

  • Для тестирования вы просто помещаете соединение с базой данных в класс Singleton.

Edit:

О вопросах пула соединений (я мог бы здесь не так, но это была бы моя первая попытка):

  • Держите все соединения открытыми. Pop, когда вам нужно, put, когда он вам больше не нужен, как обычная очередь. Эта очередь может быть выставлена ​​из Singleton.

  • Вы начинаете с фиксированного номера соединений по умолчанию (например, 20). Вы можете переопределить метод pop, поэтому, когда очередь пуста, вы блокируете (подождите, пока другой освободится, если программа многопоточная) или создайте новое соединение «на лету».

  • Разрушающие соединения более тонкие. Вам нужно отслеживать, сколько подключений используется программой, и насколько вероятно, что у вас слишком много соединений. Будьте осторожны, так как уничтожение соединения, которое потребуется позже, замедляет работу программы. В конце концов, это эвристическая проблема, которая изменяет характеристики производительности.

+0

Таким образом, я получаю соединение из бассейна, когда мне нужно что-то делать. Затем, как/когда я должен вернуть его? Кроме того, соединения в пуле должны быть уже открыты, когда они выскользнули или их следует открыть после всплытия? Когда мне нужно закрыть одно соединение? Извините за множество вопросов, но соединение пула не совсем мне знакомо. – linkyndy

+1

Редактирование вопроса, чтобы добавить эти ответы. – BoppreH

+0

Это звучит слишком сложно для моих требований. Я ожидаю открыть соединение перед использованием своих моделей, выполнить необходимые операции с ними, которые требуют подключения, а затем закрыть соединение. Я думаю, мне нужны некоторые подсказки о том, где хранить объект подключения, а не как обращаться с ним в моем приложении ... следовательно, я ищу что-то простое для удовлетворения моих основных потребностей. – linkyndy

Смежные вопросы