Как я могу предотвратить сбой подключения к БД, когда сеть нестабильна?

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

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

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

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

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


person linjunhalida    schedule 20.05.2009    source источник


Ответы (5)


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

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

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

person Johan Bresler    schedule 20.05.2009

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

person Jeff    schedule 20.05.2009
comment
Я боюсь, что иногда бывает трудно отладить, особенно для оборудования. Мы все знаем, что tcp/ip нестабилен, интернет нестабилен, но нам нужно построить стабильную систему над этим. - person linjunhalida; 20.05.2009
comment
@JD, иногда вы подключаетесь к глобальной сети или другой сети, находящейся вне вашего контроля. - person Mark Harrison; 20.05.2009
comment
@Mark Harrison Если вам нужно установить соединения с БД через ненадежное или неконтролируемое сетевое соединение, измените архитектуру вашего приложения, чтобы использовать другой протокол для взаимодействия с БД. Классическим примером может быть использование веб-служб XML вместо того, чтобы пытаться напрямую подключаться к БД. По моему опыту, соединения с БД чрезвычайно болтливы и не подходят для плохих сетей. - person Jeff; 20.05.2009

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

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

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

person Mihaela    schedule 20.05.2009

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

person skamradt    schedule 20.05.2009

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

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

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

person Francis Lee    schedule 13.07.2009