Программирование GUI. Синхронизация базы данных и таблиц - PullRequest
1 голос
/ 29 декабря 2008

Я работал над несколькими настольными приложениями, которые использовали таблицы для группировки информации из таблицы базы данных. Но обновление этой информации заставило меня взломать различные решения, такие как рабочий поток, который обновляет таблицу, выполняющую запрос каждые X секунд, или просто кнопку, чтобы обновить представление. Я даже видел приложение, которое обновляло бы таблицу, используя события движения мыши. Поэтому мой вопрос в том, какой метод вы предпочитаете. Есть ли «идеальный» способ достижения этого, когда я сплю в колледже? Спасибо за ответы, люди.

Ответы [ 6 ]

3 голосов
/ 29 декабря 2008

Чего вы пытаетесь достичь?
Это какое-то приложение для мониторинга в реальном времени, такое как биржевая торговля, программное обеспечение для мониторинга предприятий или у вас есть сетка в каком-либо приложении CRUD, которое вы хотите автоматически обновлять?

Если это сырое приложение , то первое, что я хотел бы сделать, это проверить требования:

  • Действительно ли необходимо, чтобы ваш пользователь постоянно обновлял информацию автоматически,
  • Ваш пользователь постоянно смотрит на монитор?
  • Почему? Может быть, вы можете внедрить какую-то систему оповещения, которую можно проверять реже?

Если вам действительно нужен подход, который вы описали, то у вас все хорошо - вы можете использовать либо таймер, либо какое-то другое событие (кнопка, перемещение мыши, ...) для обновления данных. Конечно, постоянные запросы станут проблемой производительности по мере увеличения числа пользователей.

Если это программное обеспечение для мониторинга в реальном времени с большим количеством данных, то вам не следует помещать базу данных в центр системы. У вас должна быть центральная служба, к которой ваши клиенты подключаются через TCP (или какой-то подобный протокол). Центральная служба должна сохранять последнее состояние системы (плюс, возможно, некоторую историю). Клиенты могут подключаться к сервису, а сервис должен уведомлять клиентов при появлении новых данных, чтобы избежать постоянного опроса. База данных должна использоваться в качестве журнала, который приложение использует для анализа прошлых событий, но не для отображения в реальном времени.

Редактировать:

Относительно ответа Андрея: я не уверен, решит ли это вашу проблему. Шаблон наблюдателя обычно реализуется с помощью механизма подписки / уведомления, так что источник данных может уведомлять всех наблюдателей при изменении данных. Проблема в том, что СУБД обычно не имеют механизма, который может уведомлять вас об изменении данных. Даже если они имеют, это не практично, потому что может быть большое количество изменений за короткий период времени. Подумайте о десятках или сотнях обновлений в секунду - как часто СУБД должна уведомлять клиентов об изменениях? Что делать, если есть сотни клиентов с медленной сетью? Когда у вас более одного пользователя, все становится сложнее.

Привязка данных работает - вы не можете привязать свою сетку непосредственно к таблице в базе данных. Сначала вам нужно передать данные в ваше приложение в некоторый объект, который может быть связан с GUI (наборы данных, списки, ...)

2 голосов
/ 29 декабря 2008

Некоторые языки программирования / фреймворки имеют встроенную поддержку привязки данных. Привязка данных синхронизирует представление (компонент таблицы) и данные (таблицы базы данных).

Например, во Flex есть встроенная привязка, также javafx, для обычной java вы можете использовать привязки jgoodies или средства управления данными adf и oracle для связывания данных.

Если ваш язык не имеет стандартного решения для связывания, может быть полезно взглянуть на то, как реализовано существующее, например, привязки jgoodies (это с открытым исходным кодом).

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

Edit:

Хороший вопрос об изменениях базы данных. Это немного сложнее. Технически должно быть возможно использовать триггеры для информирования клиента. Например, в Oracle триггер может публиковать сообщение о событии изменения данных в очереди сообщений, используя расширенные очереди, которые может прослушать заинтересованный клиент. Я не видел это на практике, хотя. Обычно вы не хотите помещать знания о клиентах GUI в свою базу данных.

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

0 голосов
/ 29 декабря 2008

Очень полезно, Андрей. Похоже, что привязки данных - это самый простой способ, когда у вас есть возможность их использовать.

Ах да, схема наблюдателя:

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

Мне очень удобно, когда C # объявляет новые события с использованием делегатов.

Спасибо за ваши очень хорошие ответы.

0 голосов
/ 29 декабря 2008

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

0 голосов
/ 29 декабря 2008

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

0 голосов
/ 29 декабря 2008

Идеальный соответствует вашим потребностям, но многие веб-сайты просто обновляют таблицу всякий раз, когда вы обновляете ячейку. Это генерирует много трафика. Может быть, вы могли бы поставить в очередь обновления с помощью, например, транзакции, а затем зафиксировать, когда пользователь закрывает данную таблицу, нажимает save или истекает время ожидания?

Я думаю, все зависит от вашего конкретного приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...