Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
1000a9e
Пул соединений переносится в ИсточникДанных: ленивое создание, Закрыт…
claude Sep 11, 2026
d3f82a3
Хранилища сущностей живут с пулом источника; наборы тестов создают ис…
claude Sep 11, 2026
c841bd4
Внутреннее API работает через ИсточникДанных, а не через пул соединений
claude Sep 11, 2026
faf4e33
Менеджер закрывает источник, который создал сам; замечания SonarQube
claude Sep 11, 2026
5a69ff6
Источник закрывает хранилища и без созданного пула; правки документац…
claude Sep 11, 2026
11ef45c
Заглушка поиска тестового коннектора отвечает пустым результатом
claude Sep 11, 2026
fdec01f
Помощник подключения классов сущностей назван без слова, которое Sona…
claude Sep 11, 2026
e21ec61
Пул соединений создается вместе с источником, а не при первом обращении
claude Sep 12, 2026
f7b3e13
Закрытый источник хранилищ не выдает
claude Sep 12, 2026
8a3e70a
Признаки закрытия и автозакрытия источника стали атомарными
claude Sep 12, 2026
7b94b63
Ошибка закрытия не делает источник закрытым
claude Sep 12, 2026
3fb1411
Документация приведена к пулу в источнике; сборка мусора перенесена в…
claude Sep 12, 2026
1c2989a
Хранилище работает через источник, а не «источником»
claude Sep 12, 2026
ea81842
entity v5: менеджер сущностей создается только из источника данных
claude Sep 12, 2026
333c6ad
Описание переменной источника в наборах коннекторов
claude Sep 12, 2026
cc4a176
Тесты закрывают источник данных явно
claude Sep 12, 2026
633f721
Хранилища сущностей принадлежат менеджеру, а не источнику
claude Sep 12, 2026
f483d90
Описание параметра СобратьСущность приведено к сигнатуре
claude Sep 12, 2026
96b88e9
Хранилище делегирует операции менеджеру, а не наоборот
claude Sep 12, 2026
0a8b2e9
Активная запись строится одним построителем
claude Sep 12, 2026
ba056c6
Творительный падеж убран из формулировок «работает чем-то»
claude Sep 12, 2026
9c1c879
Bsldoc описывает контракт класса, а не соседние классы
claude Sep 12, 2026
e9bdc76
Декоратор поднят до 3.0.0, в зависимости разработки добавлен moskito
claude Sep 13, 2026
33c05bf
Неудачное закрытие пула не оставляет закрытые соединения за потоками
claude Sep 13, 2026
973b18a
Тест возврата соединения после обрыва переведен на поддельный поток
claude Sep 13, 2026
8f48878
Удален тест очистки списка фоновых заданий
claude Sep 13, 2026
84094e6
Из пула убраны геттеры параметров соединения
claude Sep 13, 2026
be3ad9d
Помощники двух новых наборов вынесены в ТестовыеУтилиты
claude Sep 13, 2026
6ffbac1
ИсточникСТранзакциями вынесен в ТестовыеУтилиты
claude Sep 13, 2026
a564de0
Убраны замечания Sonar от переноса помощников
claude Sep 13, 2026
1ed6e42
Тест на геттер признака автозакрытия источника
claude Sep 13, 2026
8b84d17
Замечание Sonar: опечатка в строке соединения теста
claude Sep 13, 2026
e58bf2e
Закрытие пула не теряет соединение, на котором упало
claude Sep 13, 2026
561c41d
Хранилище незарегистрированного типа не создается и не кэшируется
claude Sep 13, 2026
7e00039
Замечание Sonar: пустой блок Исключение в тесте
claude Sep 13, 2026
1601a41
Замечание Sonar: служебный тег в модуле внутреннего API
claude Sep 13, 2026
f3e77f4
Проверка регистрации типа переехала в менеджер сущностей
claude Sep 13, 2026
4f695a2
Ошибка автозакрытия источника не обрывает остальных подписчиков потока
claude Sep 13, 2026
397e56a
Замечание Sonar: параметры тестового коннектора собираются помощником
claude Sep 13, 2026
8d53e3b
Замечание Sonar: длина строки после переезда помощника
claude Sep 13, 2026
ad35112
Закрытый менеджер сущностей отказывает во всех операциях
claude Sep 13, 2026
9727889
Из bsldoc убраны отсылки к устройству соседних классов
claude Sep 13, 2026
cc63fef
Описание закрытия менеджера не говорит о соединениях
claude Sep 13, 2026
d24a529
Закрытие пула не считает соединение снятой заявки дважды
claude Sep 13, 2026
d205d80
Источник считается закрытым только после закрытия пула
claude Sep 13, 2026
ed7923f
Замечание Sonar: число необязательных параметров помощника
claude Sep 13, 2026
ae2947c
Настройки тестового коннектора задаются объектом, а не позициями в ма…
claude Sep 13, 2026
6f1b0d6
Замечание Sonar: открытые поля класса настроек
claude Sep 13, 2026
4801fe2
Неудачный неявный откат делает соединение непригодным
claude Sep 13, 2026
c82af24
Замечание Sonar: опечатка в сообщении проверки
claude Sep 13, 2026
44220bf
Ошибка закрытия при возврате не отнимает место в пуле
claude Sep 13, 2026
9cbcdaa
Обработчик завершения потока в пуле не обрывает остальных подписчиков
claude Sep 14, 2026
c2d3462
Признак закрытия менеджера выставляется после закрытия хранилищ
claude Sep 14, 2026
565712f
Закрытие менеджера не чистит модель данных
claude Sep 14, 2026
556fcc3
МодельДанных.Очистить() удален
claude Sep 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@

### МенеджерСущностей

МенеджерСущностей предоставляет публичный интерфейс по чтению, сохранению, удалению данных. МенеджерСущностей создается из ИсточникДанных, который описывает тип *коннектора* к используемой базе данных, строку соединения и размер пула; создание менеджера напрямую по параметрам соединения устарело и сохранено для совместимости. Все операции по изменению данных МенеджерСущностей делегирует Коннектору. В зоне ответственности МенеджераСущностей находятся:
МенеджерСущностей предоставляет публичный интерфейс по чтению, сохранению, удалению данных. МенеджерСущностей создается из ИсточникДанных, который задает тип *коннектора* к используемой базе данных, строку соединения и размер пула и владеет пулом соединений; других способов создать менеджер нет. Все операции по изменению данных МенеджерСущностей делегирует Коннектору. В зоне ответственности МенеджераСущностей находятся:

* Создание и наполнение МоделиДанных
* Трансляция запросов от прикладной логики к коннекторам
Expand All @@ -501,11 +501,13 @@

### ХранилищеСущностей

ХранилищеСущностей предоставляет тот же интерфейс по работе с сущностями и транзакциями, но с глобальной привязкой к конкретному типу сущности. Для получения ХранилищаСущностей служит метод `МенеджерСущностей::ПолучитьХранилищеСущностей`.
ХранилищеСущностей предоставляет тот же интерфейс по работе с сущностями и транзакциями, но с привязкой к конкретному типу сущности. Для получения ХранилищаСущностей служит метод `МенеджерСущностей::ПолучитьХранилищеСущностей`.

В отличие от МенеджераСущностей, ХранилищеСущностей не требует передачи в методы параметра "ТипСущности".

Хранилища сущностей и пулы сущностей совпадают в рамках одного типа сущности, типа коннектора и строки соединения. Другими словами, два менеджера сущности, инициализированные одним и тем же коннектором и строкой соединения, вернут одинаковые хранилища сущностей одного типа.
Своей логики работы с БД у хранилища нет: оно подставляет свой тип сущности и делегирует операцию менеджеру, которому принадлежит. Поэтому поведение вызова через хранилище и через менеджер совпадает, в том числе для транзакций и прямого доступа к БД.

Хранилища сущностей и пулы сущностей принадлежат менеджеру сущностей: хранилище работает с моделью данных того менеджера, который его создал, и закрывается вместе с ним. Один менеджер на один тип сущности всегда возвращает одно и то же хранилище, а два менеджера, созданные из одного источника данных, возвращают разные хранилища со своими пулами сущностей. Соединения при этом общие: их дает пул источника.

<a id="library-structure-connectors" />

Expand All @@ -528,7 +530,7 @@

> Важно!

Каждое ХранилищеСущностей и МенеджерСущностей хранят в себе отдельные экземпляры Коннекторов. Тип, строка соединения и параметры коннектора определяются при создании МенеджераСущностей.
Менеджеры и хранилища сущностей одного источника данных собственных коннекторов не держат: они берут соединения из общего пула этого источника. Тип, строка соединения и параметры коннектора задаются при создании ИсточникаДанных.

<a id="library-structure-data-model" />

Expand Down Expand Up @@ -578,7 +580,7 @@

Поэтому in-memory базу нельзя сочетать с **нулевым размером пула соединений**: при нулевом размере соединение открывается на операцию и закрывается сразу после нее, то есть между операциями открытых соединений не остается. Следующая операция откроет уже пустую базу и получит `no such table`. Переживет база такой промежуток или нет, зависит от внутреннего пулинга провайдера, то есть воспроизводится через раз.

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

```bsl
Держатель = Новый КоннекторSQLite;
Expand Down
74 changes: 70 additions & 4 deletions docs/ИсточникДанных.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
## ИсточникДанных

Описание источника данных: имя, тип коннектора, строка соединения, параметры коннектора
и размер пула соединений одним объектом.
Источник данных: имя, тип коннектора, строка соединения, параметры коннектора, размер пула
и сам пул соединений одним объектом.

Источник соединений не открывает, только описывает их. Тип коннектора проверяется при
создании: тип без интерфейса `АбстрактныйКоннектор` отвергается с ошибкой.
Пул создается вместе с источником и общий для всех, кто работает через источник; соединения
пул открывает при первом обращении. Закрывает пул сам источник: методом `Закрыть()` или по
завершению потока, в котором источник создан, если автозакрытие не выключено, см.
`УстановитьАвтоЗакрытие`. Закрытие терминально: закрытый источник соединений больше не выдает,
поэтому любая операция через него завершается ошибкой. Тип коннектора и размер пула
проверяются при создании: тип без интерфейса `АбстрактныйКоннектор` и размер, не являющийся
неотрицательным числом, отвергаются с ошибкой.

```bsl
Источник = Новый ИсточникДанных("Основной", Тип("КоннекторPostgreSQL"), СтрокаСоединения, , 20);
Expand Down Expand Up @@ -84,3 +89,64 @@
//
Функция РазмерПула() Экспорт
```

### УстановитьАвтоЗакрытие

```bsl
// Включает или выключает закрытие источника по завершению потока, в котором он создан.
//
// По умолчанию включено. Выключает тот, кто управляет временем жизни источника сам: контейнер
// приложения или код, создающий источник в одном потоке для работы в других. Тогда источник
// закрывается только явным Закрыть().
//
// Параметры:
// Значение - Булево - Истина - закрывать по завершению потока; Ложь - только явным Закрыть().
//
Процедура УстановитьАвтоЗакрытие(Знач Значение) Экспорт
```

### АвтоЗакрытие

```bsl
// Признак закрытия источника по завершению потока, см. УстановитьАвтоЗакрытие.
//
// Возвращаемое значение:
// Булево - Истина, если источник закрывается по завершению создавшего его потока.
//
Функция АвтоЗакрытие() Экспорт
```

### Закрыть

```bsl
// Закрывает пул соединений источника: все его соединения закрываются.
//
// Закрытие терминально: после него обращение через источник завершается ошибкой. Повторный
// вызов ничего не делает. Если закрытие завершилось ошибкой, источник закрытым не считается,
// и закрытие можно повторить: иначе оставшиеся соединения некому было бы закрыть.
//
Процедура Закрыть() Экспорт
```

### Закрыт

```bsl
// Источник закрыт, см. Закрыть.
//
// Возвращаемое значение:
// Булево - Истина после закрытия, явного или по завершению потока.
//
Функция Закрыт() Экспорт
```

### ПулСоединений

```bsl
// @internal
// Пул соединений источника. Для закрытого источника завершается ошибкой.
//
// Возвращаемое значение:
// ПулСоединенийСБД - Пул соединений.
//
Функция ПулСоединений() Экспорт
```
40 changes: 25 additions & 15 deletions docs/МенеджерСущностей.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,18 @@
```bsl
// Конструктор объекта МенеджерСущностей.
//
// Менеджер создается из источника данных: из него берутся тип коннектора, строка соединения,
// параметры коннектора и размер пула. Создание по параметрам соединения устарело и отмечается
// предупреждением в логе, как и параметры, переданные вместе с источником.
// Менеджер создается из источника данных и берет соединения из его пула: все менеджеры одного
// источника делят соединения и транзакции потоков. Параметры соединения задает источник, а его
// временем жизни управляет тот, кто источник создал.
//
// Параметры:
// ИсточникДанных - ИсточникДанных - Источник данных, из которого создается менеджер.
// - Тип - Устарел. Тип класса, реализующего интерфейс Коннектор.
// УстарелСтрокаСоединения - Строка - Устарел. Строка соединения к БД, задается в источнике данных.
// УстарелПараметрыКоннектора - Массив - Устарел. Параметры коннектора, задаются в источнике данных.
// УстарелРазмерПулаСоединений - Число - Устарел. Размер пула соединений, задается в источнике данных.
//
// Пример:
// Источник = Новый ИсточникДанных("Основной", Тип("КоннекторSQLite"), СтрокаСоединения);
// МенеджерСущностей = Новый МенеджерСущностей(Источник);
//
Процедура ПриСозданииОбъекта(
Знач ИсточникДанных,
Знач УстарелСтрокаСоединения = "",
Знач УстарелПараметрыКоннектора = Неопределено,
Знач УстарелРазмерПулаСоединений = 10
)
Процедура ПриСозданииОбъекта(Знач ИсточникДанных)
```

### ДобавитьКлассВМодель
Expand Down Expand Up @@ -140,8 +131,9 @@
### Закрыть

```bsl
// Выполняет очистку полную данных библиотеки.
// Дополнительно посылает всем используемым коннекторам запросы на закрытие соединения.
// Закрывает хранилища менеджера: после Закрыть() менеджер к работе непригоден. Закрытие
// терминально - у закрытого менеджера работают только геттеры и повторное закрытие, любой
// другой метод завершается ошибкой.
//
Процедура Закрыть()
```
Expand Down Expand Up @@ -210,11 +202,29 @@
Функция ВычислитьСКоннектором(Знач Алгоритм, Знач Контекст = Неопределено, Знач Объект = Неопределено)
```

### ИсточникДанных

```bsl
// Источник данных, из которого создан менеджер.
//
// Все обращения менеджера к БД идут через соединения этого источника.
//
// Возвращаемое значение:
// ИсточникДанных - Источник данных менеджера.
//
Функция ИсточникДанных() Экспорт
```

### ПолучитьХранилищеСущностей

```bsl
// Получает ХранилищеСущностей, привязанное к переданному типу сущности.
//
// Хранилище создается при первом обращении и живет до закрытия менеджера: на один тип сущности
// менеджер всегда выдает одно и то же хранилище. Обращение к закрытому менеджеру завершается
// ошибкой, как и обращение за типом, не зарегистрированным в модели: такой тип можно
// зарегистрировать и получить хранилище снова.
//
// Параметры:
// ТипСущности - Тип - Тип сущности, зарегистрированный в Модели
//
Expand Down
7 changes: 0 additions & 7 deletions docs/МодельДанных.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,3 @@
Функция СоздатьОбъектМодели(ТипСущности) Экспорт
```

### Очистить

```bsl

Процедура Очистить() Экспорт
```

Loading
Loading