Skip to content

Настройка источников данных ​

Библиотека autumn-data поддерживает работу с множественными источниками данных через конфигурацию в рамках autumn framework.

Основные понятия ​

Источник данных ​

Источник данных определяет подключение к конкретной базе данных. Каждый источник данных имеет:

  • Имя - уникальный идентификатор источника
  • Тип коннектора - класс коннектора для подключения к БД
  • Строку соединения - параметры подключения к БД
  • Параметры коннектора - дополнительные параметры
  • Размер пула - предел одновременных соединений с БД, по умолчанию 10

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

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

Конфигурация одного источника данных ​

Как json ​

json
{
    "data": {
        "ИсточникиДанных": {
            "Основной": {
                "ТипКоннектора": "КоннекторSqlite",
                "СтрокаСоединения": "Data Source=database.db"
            }
        }
    }
}

При такой конфигурации создается источник данных "Основной", и все хранилища будут использовать его по умолчанию. Дополнительно хранилища и менеджер сущностей будут доступны без указания имени источника данных.

Как массив с одним элементом ​

bsl
Детальки = Новый Соответствие();

СекцияData = Новый Соответствие();
Детальки.Вставить("data", СекцияData);

ИсточникиДанных = Новый Соответствие();
СекцияData.Вставить("ИсточникиДанных", ИсточникиДанных);

ИсточникиДанных.Вставить("ТипКоннектора", "КоннекторSQLite");
ИсточникиДанных.Вставить("СтрокаСоединения", "Data Source=database.db");

СоветДругогоМастера = Новый СоветДругогоМастера();
СоветДругогоМастера.ЗначенияДеталек(Детальки);

Поделка = Новый Поделка(СоветДругогоМастера);
Поделка.ЗапуститьПриложение();

При такой конфигурации создается источник данных "Основной", и все хранилища будут использовать его по умолчанию. Дополнительно хранилища и менеджер сущностей будут доступны без указания имени источника данных.

Как соответствие ​

bsl
Детальки = Новый Соответствие();

СекцияData = Новый Соответствие();
Детальки.Вставить("data", СекцияData);

ИсточникиДанных = Новый Соответствие();
СекцияData.Вставить("ИсточникиДанных", ИсточникиДанных);

ИсточникиДанных.Вставить("Имя", "МойИсточник");
ИсточникиДанных.Вставить("ТипКоннектора", "КоннекторInMemory");

СоветДругогоМастера = Новый СоветДругогоМастера();
СоветДругогоМастера.ЗначенияДеталек(Детальки);

Поделка = Новый Поделка(СоветДругогоМастера);
Поделка.ЗапуститьПриложение();

При такой конфигурации создается источник данных "МойИсточник". При обращении к хранилищам сущностей, менеджеру сущностей и в описаниях сущностей нужно будет явно указывать имя источника данных.

Конфигурация множественных источников данных ​

Как json ​

json
{
    "data": {
        "ИсточникиДанных": [
            "Основной": {
                "ТипКоннектора": "КоннекторSQLite",
                "СтрокаСоединения": "Data Source=main.db"
            },
            "Дополнительный": {
                "ТипКоннектора": "КоннекторPostgreSQL",
                "СтрокаСоединения": "Host=localhost;Database=testdb;Username=user;Password=pass"
            }
        ]
    }
}

Как массив с несколькими элементами ​

bsl
Детальки = Новый Соответствие();

СекцияData = Новый Соответствие();
Детальки.Вставить("data", СекцияData);

ИсточникиДанных = Новый Массив();
СекцияData.Вставить("ИсточникиДанных", ИсточникиДанных);

ИсточникДанных = Новый Соответствие();	
ИсточникДанных.Вставить("Имя", "Основной");
ИсточникДанных.Вставить("ТипКоннектора", "КоннекторInMemory");

ИсточникиДанных.Добавить(ИсточникДанных);

ИсточникДанных = Новый Соответствие();
ИсточникДанных.Вставить("Имя", "Дополнительный");
ИсточникДанных.Вставить("ТипКоннектора", "КоннекторSQLite");
ИсточникДанных.Вставить("СтрокаСоединения", "FullUri=file::memory:?cache=shared");

ИсточникиДанных.Добавить(ИсточникДанных);

СоветДругогоМастера = Новый СоветДругогоМастера();
СоветДругогоМастера.ЗначенияДеталек(Детальки);

Поделка = Новый Поделка(СоветДругогоМастера);
Поделка.ЗапуститьПриложение();

При задании нескольких источников данных кодом доступен только вариант с массивом.

Размер пула соединений ​

Параметр РазмерПула задает предел одновременных соединений с БД. Если не задан, пул вмещает 10 соединений. Ноль отключает переиспользование соединений: каждое обращение к БД открывает свое соединение и закрывает его по завершении.

json
{
    "data": {
        "ИсточникиДанных": {
            "Основной": {
                "ТипКоннектора": "КоннекторPostgreSQL",
                "СтрокаСоединения": "Host=localhost;Database=testdb",
                "РазмерПула": 20
            }
        }
    }
}
bsl
ИсточникиДанных.Вставить("ТипКоннектора", "КоннекторPostgreSQL");
ИсточникиДанных.Вставить("СтрокаСоединения", "Host=localhost;Database=testdb");
ИсточникиДанных.Вставить("РазмерПула", 20);

Размер доступен и из желудя источника: ИсточникДанных.РазмерПула().

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

Источник данных entity сообщает наблюдателям обо всем, что с ним происходит: операциях менеджера сущностей, запросах к СУБД, соединениях и транзакциях, см. наблюдателей источника данных в entity. autumn-data регистрирует наблюдателей сама: каждый желудь с прозвищем НаблюдательИсточникаДанных регистрируется на всех источниках данных до создания менеджеров сущностей, поэтому наблюдатель видит и создание таблиц.

bsl
&Желудь
&Прозвище("НаблюдательИсточникаДанных")
&Реализует("НаблюдательИсточникаДанных")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Процедура ПередСобытием(Событие) Экспорт
КонецПроцедуры

Процедура ПослеСобытия(Событие) Экспорт
    Если Событие.Вид() = ВидыСобытийИсточникаДанных.Запрос() И Событие.Длительность() > 100 Тогда
        Сообщить(СтрШаблон("Медленный %1 к %2: %3 мс", Событие.Операция(), Событие.ИмяТаблицы(), Событие.Длительность()));
    КонецЕсли;
КонецПроцедуры

Завязь с таким прозвищем вправе вернуть Неопределено - так наблюдение выключается настройкой. Без желудей с прозвищем источники остаются без наблюдателей.

Доступ к коннектору ​

Коннектор принадлежит соединению, а не прикладному коду. Менеджер и хранилища выполняют алгоритм на занятом соединении: ВыполнитьСКоннектором(Алгоритм, Контекст) и ВычислитьСКоннектором(Алгоритм, Контекст), где алгоритм - лямбда с параметром Коннектор.

bsl
Хранилище = Поделка.НайтиЖелудь("ХранилищеСущностейОсновнойФизическоеЛицо");
Строки = Хранилище.ВычислитьСКоннектором("Коннектор -> Коннектор.ВыполнитьЗапрос(Текст)", Новый Структура("Текст", "SELECT * FROM ФизическиеЛица"));

Указание источника данных для сущности ​

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

bsl
// Использует единственный источник данных
&Сущность(ИмяТаблицы = "Пользователи")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Использует явно указанный дополнительный источник данных
&Сущность(ИмяТаблицы = "Документы", ИсточникДанных = "Дополнительный")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Указание источника данных для хранилища сущностей ​

Аналогично для хранилищ сущностей:

bsl
// Хранилище для единственного источника данных
&ХранилищеСущностей("Пользователь")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Хранилище для дополнительного источника данных
&ХранилищеСущностей("Документ", ИсточникДанных = "Дополнительный")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Получение хранилищ из контейнера ​

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

bsl
// Для основного источника
ХранилищеПользователей = Поделка.НайтиЖелудь("ХранилищеСущностейОсновнойПользователь");

// Для дополнительного источника  
ХранилищеДокументов = Поделка.НайтиЖелудь("ХранилищеСущностейДополнительныйДокумент");

// Также можно использовать прозвища
ХранилищеПользователей = Поделка.НайтиЖелудь("ХранилищеСущностейОсновной");
ХранилищеДокументов = Поделка.НайтиЖелудь("ХранилищеСущностейДополнительный");

Поддерживаемые типы коннекторов ​

Библиотека поддерживает все коннекторы из библиотеки entity:

  • КоннекторSQLite
  • КоннекторPostgreSQL
  • КоннекторJSON
  • КоннекторInMemory (для тестирования)
  • И другие коннекторы, поддерживаемые entity

Параметры коннектора ​

Некоторые коннекторы могут требовать дополнительные параметры, которые передаются через массив ПараметрыКоннектора:

json
{
    "data": {
        "ИсточникиДанных": {
            "Дополнительный": {
                "ТипКоннектора": "КоннекторPostgreSQL",
                "СтрокаСоединения": "Host=localhost;Database=testdb",
                "ПараметрыКоннектора": [      
                    "дополнительный_параметр"
                ]                             
            }
        }
    }
}
bsl
Детальки = Новый Соответствие();

СекцияData = Новый Соответствие();
Детальки.Вставить("data", СекцияData);

ИсточникиДанных = Новый Соответствие();
СекцияData.Вставить("ИсточникиДанных", ИсточникиДанных);

ИсточникиДанных.Вставить("ТипКоннектора", "КоннекторSQLite");
ИсточникиДанных.Вставить("СтрокаСоединения", "Data Source=database.db");

ПараметрыКоннектора = Новый Массив();
ПараметрыКоннектора.Добавить("дополнительный_параметр");
ИсточникиДанных.Вставить("ПараметрыКоннектора", ПараметрыКоннектора);

СоветДругогоМастера = Новый СоветДругогоМастера();
СоветДругогоМастера.ЗначенияДеталек(Детальки);

Поделка = Новый Поделка(СоветДругогоМастера);
Поделка.ЗапуститьПриложение();