v5.4.0.0
Мажорный релиз: менеджер сущностей создаётся только из ИсточникДанных, и источник же отвечает за соединения. Поверх этого появился 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