Skip to content

v5.4.0.0

Choose a tag to compare

@nixel2007 nixel2007 released this 15 Sep 10:59
· 17 commits to master since this release
0a91625

Мажорный релиз: менеджер сущностей создаётся только из ИсточникДанных, и источник же отвечает за соединения. Поверх этого появился SPI наблюдателей над операциями entity - доступны трассировка и метрики без правки entity и коннекторов.

API коннекторов остаётся четвёртой версии, свои коннекторы переписывать не нужно. Для (опциональной) работы механизма наблюдения Коннектор должен до-реализовать новый интерфейс.

Ломающие изменения

Менеджер создаётся только из источника данных

// Было
МенеджерСущностей = Новый МенеджерСущностей(Тип("КоннекторSQLite"), СтрокаСоединения, ПараметрыКоннектора, РазмерПула);

// Стало
Источник = Новый ИсточникДанных("Основной", Тип("КоннекторSQLite"), СтрокаСоединения, ПараметрыКоннектора, РазмерПула);
МенеджерСущностей = Новый МенеджерСущностей(Источник);

Передача параметров соединения вместо источника завершается ошибкой.

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

Соединения закрывает источник, а не менеджер

МенеджерСущностей.Закрыть() закрывает только хранилища своего менеджера. Соединения/коннекторы закрывает Источник.Закрыть().

Источник подписывается на завершение создавшего его потока и закрывается вместе с ним. Если источник создаётся в кратковременно живущем потоке (например, в Фоновом задании), а работают с ним в других других потоков - контейнеры приложения, тесты, - автозакрытие стоит выключать явно:

Источник.УстановитьАвтоЗакрытие(Ложь);

Удалено

Было Стало
МенеджерСущностей(ТипКоннектора, СтрокаСоединения, ПараметрыКоннектора, РазмерПула) МенеджерСущностей(ИсточникДанных)
МодельДанных.Очистить() модель неизменяема с момента инициализации и уходит в мусор вместе с менеджером

Хранилища сущностей принадлежат менеджеру

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

Наблюдатели источника данных

SPI для трассировки и метрик: приложение видит, что делает ORM, не меняя ни entity, ни коннекторы. entity не знает об особенностях реализации наблюдателей, библиотека лишь публикует события, которые обрабатывают наблюдатели.

Источник = Новый ИсточникДанных("Основной", Тип("КоннекторSQLite"), СтрокаСоединения);
Источник.ДобавитьНаблюдателя(Новый МедленныеЗапросы);

Наблюдатель — объект с аннотацией &Реализует("НаблюдательИсточникаДанных") и методами ПередСобытием/ПослеСобытия. Виды событий:

  • Операция — вызов менеджера или хранилища: тип сущности, таблица, вложенность, число строк;
  • Запрос — обращение коннектора к СУБД: текст с плейсхолдерами вместо значений, число строк;
  • Соединение — получение и возврат соединения: ожидание в очереди, признак открытия нового соединения, согласованный снимок занятости;
  • Транзакция — от начала до исхода commit, rollback, failed или abandoned, с вложенными транзакциями.

Без зарегистрированных наблюдателей события не создаются. Ошибка наблюдателя операцию не прерывает — пишется предупреждением в лог oscript.lib.entity.observers.

Свой коннектор может отдавать и события запросов — для этого он объявляет второй интерфейс НаблюдаемыйКоннектор. Коннектор без него работает как раньше, просто не даёт событий уровня запроса.

Подробности — в docs/Наблюдатели.md.

What's Changed

  • Менеджер сущностей создается из ИсточникДанных by @nixel2007 in #145
  • entity 5: пул соединений принадлежит ИсточникДанных, менеджер создается только из него by @nixel2007 in #146
  • Наблюдатели источника данных: SPI для трассировки и метрик by @nixel2007 in #143

Full Changelog: v4.4.0.1...v5.4.0.0