Как заставить пул соединений работать в 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. Там он описывает среди других тем также пул соединений с базой данных с помощью драйвера делегирования пула.

По крайней мере, эти примеры помогли мне понять, как работает пул соединений!

Другие вопросы по тегам