Как заставить пул соединений работать в DBX?
Что ж, мне удалось настроить драйвер делегата правильно, но пул соединений все еще доставляет мне много хлопот.
Из приведенных в документации описаний видно, что пул соединений должен работать так:
- Настройте делегат драйвера DBXPool для одного глобального объекта Connection
- Использовать этот объект Connection для всех вызовов в базу данных
- Каждый вызов БД будет автоматически маршрутизироваться через драйвер делегата в соединение, уникальное для его потока, принадлежащее пулу соединений.
На практике я обнаружил, что все, похоже, все еще обрабатывается глобальным объектом Connection, что приводит к всевозможным странным состояниям гонки и сбоям при попытке выполнить запросы к БД из нескольких параллельных потоков.
В случае, если это уместно, у меня не определено много специфичных для DBX компонентов; Я обычно запускаю запросы, вызывая Connection.Execute
метод.
Есть идеи, что я делаю не так? Я где-то пропускаю шаг или плохо понимаю, как работает драйвер делегата DBXPool?
1 ответ
Delphi поставляется с примером проекта DelegatesSample. На моей машине он находится в папке \Documents\RAD Studio\8.0\Samples\Delphi\Database\dbExpress\Delegates.
Каждое соединение в пуле имеет свой собственный объект TDBXConnection. В примере исходного кода каждое соединение создается путем вызова TDBXConnectionFactory.GetConnectionFactory.GetConnection()
,
Как вы, конечно, знаете, каждый запрос в потоке должен иметь свой собственный объект подключения.
У Феликса Колибри также есть отличная статья о программировании на Delphi DBX4. Там он описывает среди других тем также пул соединений с базой данных с помощью драйвера делегирования пула.
По крайней мере, эти примеры помогли мне понять, как работает пул соединений!