Как я могу предотвратить сбой соединения с БД при нестабильной работе сети? - PullRequest
4 голосов
/ 20 мая 2009

У нас есть приложение, которое использует BDE, подключенный к БД Oracle.
Я использую TQuery для запросов SQL, и он подключается к базе данных TDatabase, мы не профессиональные программисты и не знаем, что происходит в тайне.

Наша сеть нестабильна, у нас проблема с потерей пакетов.

При возникновении проблемы наше приложение отключается от сервера БД или не может завершить текущий запрос.
Каков наилучший способ справиться с этим?

Наша сетевая команда в настоящее время работает над устранением проблемы с корнем, и мы изменили код для повторного подключения к базе данных при сбое. Мы столкнулись с проблемой количества открытых сеансов на нашем сервере баз данных.

Есть ли какое-то решение для этого?
Похоже, это общая проблема для нас.

Ответы [ 5 ]

3 голосов
/ 20 мая 2009

Я предлагаю следующее для компонента базы данных.

  1. подключайтесь на каждом sql и закрывайте по завершении.
  2. Использовать тайм-аут соединения и запрос перезапуска, если есть тайм-аут
  3. Если база данных отключена, поместите данные в локальную базу данных на клиенте и перезапустите передачу в центральную базу данных, как только снова появится подключение. Таким образом, вы не потеряете данные.
  4. Используйте таймер для проверки подключения к центральной базе данных, чтобы выполнить буферизацию непереданных данных.

Эта проблема характерна для сбора данных о цехах, и приведенное выше предложение является единственным способом эффективного решения этой проблемы.

2 голосов
/ 21 мая 2009

Переход на n-уровневое решение также может помочь ... особенно, если средний уровень также находится на сервере базы данных, поэтому его подключение является локальным. В большинстве последних реализаций Delphi в качестве промежуточного уровня используется пользовательский HTTP-сервер, преимущество которого заключается в том, что соединение требуется только для текущего выполняемого запроса. Как только запрос завершен, соединение может быть разорвано без проблем. .

2 голосов
/ 20 мая 2009

Извините за краткий ответ ... исправить вашу сеть. Это действительно лучший вариант для вас на данный момент.

1 голос
/ 14 июля 2009

Используйте технологию DBExpress вместо ADO чего-либо еще. Структура dbquery + provider + Clientdataset "отключена" по проекту.

Вы можете протестировать, просто открыв набор данных, разорвав соединение, повторно подключившись и опубликовав данные.

Кстати, с помощью DBExpress легко обновить приложение до n-уровневого сценария.

1 голос
/ 20 мая 2009

Попробуйте реализовать "сторожевой" поток, который:

  1. Пингует сеть (IP-адрес сервера базы данных) каждые X секунд
  2. Если недоступно, отключить интерфейс и попытаться подключиться снова

Примите во внимание, что любая транзакция может не иметь успеха вообще, и сохраните эту информацию где-нибудь. Затем, после подключения через поток «watchdog», попробуйте предварительно выполнить эту транзакцию, если это позволяет природа транзакции.

...