Вопрос

Я создал приложение MS Access 2003, настроенное как разделенная конфигурация front-end / back-end, с группой пользователей примерно из пяти человек.Интерфейс .mdb находится на сетевом файловом сервере и содержит все запросы, формы, отчеты и код VBA, а также ссылки на все таблицы в интерфейсе .mdb и некоторые ссылки на источники данных ODBC, такие как AS / 400.Серверная часть находится на том же сетевом файловом сервере, и в ней есть только табличные данные.

Это работало хорошо, пока я не "заработал", и горстка моих пользователей не начала приходить с запросами на улучшение, сообщениями об ошибках и т.д.Я внедрял новый код, разрабатывая / тестируя свою собственную копию front-end .mdb в другой сетевой папке (которая связана с тем же back-end .mdb), затем размещал свой готовый файл в папке "приходи и получай", предупреждая пользователей, и они копировали / вставляли новый front-end файл в свои собственные папки в сети.Таким образом, каждый пользователь может обновлять свой интерфейс, когда он находится в "точке остановки", без необходимости загружать всех сразу.

Я обнаружил, что, когда я разрабатываю сейчас, иногда доступ становится чрезвычайно медленным.Например, когда я разрабатываю форму и пытаюсь щелкнуть раскрывающийся список в окне свойств, появится стрелка раскрывающегося списка, но потребуется несколько секунд, прежде чем появится список параметров.Или есть тонны задержек при выборе и перемещении элементов управления в форме.Или сильная задержка клавиатуры.

Тогда, в другое время, отставания вообще не будет.

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

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

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

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

Редактировать:Мне следовало бы добавить, что я застрял с MS Access (не MS-SQL или любым другим "реальным" серверным модулем);для получения более подробной информации смотрите мой комментарий к этому сообщению.

Это было полезно?

Решение

Если все ваши пользователи используют общий интерфейс, это НЕПРАВИЛЬНАЯ КОНФИГУРАЦИЯ.

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

Мне непонятно, как вы могли бы разрабатывать в той же копии интерфейса, которую используют конечные пользователи, начиная с A2000, это запрещено (из-за "монолитной модели сохранения", где весь проект VBA хранится в одном большом двоичном поле в одной записи в одной из системных таблиц).

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

  1. отключите КОМПИЛЯЦИЮ ПО ТРЕБОВАНИЮ в настройках VBE.

  2. убедитесь, что вам требуется ЯВНЫЙ ПАРАМЕТР.

  3. компилируйте свой код часто, после каждых нескольких строк кода - чтобы упростить это, добавьте кнопку COMPILE на панель инструментов VBE (пока я этим занимаюсь, я также добавляю кнопку CALL STACK).

  4. периодически делайте резервную копию вашего интерфейса и декомпилируйте и перекомпилируйте код.Это достигается путем запуска Access с помощью переключателя / decompile, открытия вашего интерфейса, закрытия Access, открытия вашего интерфейса с помощью Access (при нажатой клавише SHIFT для обхода кода запуска), затем уплотнения декомпилированного интерфейса (при нажатой клавише SHIFT), затем компиляции всего проекта и уплотнения в последний раз.Вы должны сделать это перед любым крупным выпуском кода.

Еще несколько мыслей:

  1. вы не говорите, является ли это Windows server.Серверы Linux, к которым осуществлялся доступ через SAMBA, в прошлом сталкивались с проблемами (хотя некоторые люди клянутся ими и говорят, что они значительно быстрее серверов Windows), и исторически серверам Novell требовались настройки, позволяющие надежно редактировать файлы Jet.Существуют также некоторые настройки (например, OPLOCKS), которые можно настроить на сервере Windows, чтобы все работало лучше.

  2. храните свои Jet MDB в общих ресурсах с короткими путями.\Server\Data\MyProject\MyReallyLongFolderName\Access\Databases\ будет намного медленнее считывать данные, чем \Server\Databases.Это действительно имеет огромное значение.

  3. связанные таблицы хранят метаданные, которые могут устареть.Чтобы это исправить, нужно предпринять два простых шага и один решительный.Сначала уплотните заднюю часть, а затем переднюю.Это самый простой вариант.Если это не поможет, полностью удалите ссылки и создайте их заново с нуля.

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

  5. видишь Часто задаваемые вопросы о выступлении Тони Тьюза для получения другой обобщенной информации о производительности.

Другие советы

1) Повторно свяжите таблицы доступа из кода http://www.mvps.org/access/tables/tbl0009.htm

Как только я буду готов опубликовать новый MDE для пользователей, я повторно свяжу таблицы, создам MDE и скопирую MDE на сервер.

2) Я специально создал бесплатную утилиту автоматического обновления FE, чтобы я мог вносить изменения в FE MDE так часто, как я хотел, и быть совершенно уверенным, что в следующий раз, когда кто-то захочет запустить приложение, оно будет работать с последней версией.Для получения дополнительной информации об ошибках или утилите автоматического обновления FE смотрите бесплатную утилиту автоматического обновления FE по адресу http://www.granite.ab.ca/access/autofe.htm на моем веб-сайте, чтобы поддерживать FE на каждом компьютере в актуальном состоянии.

3) Теперь, работая на сайте у клиента, я вношу обновления в структуру таблицы в нерабочее время, когда все находятся вне системы.Посмотрите, КАК:Обнаружение времени простоя пользователя или бездействия в Access 2000 (Q210297) http://support.microsoft.com/?kbid=210297 АСС:Как определить время простоя или бездействия пользователя (Q128814) http://support.microsoft.com/?kbid=128814

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

Кроме того, предварительный просмотр печати иногда не позволял пользователям запускать пункт меню для экспорта отчета в Excel или другие.Таким образом, вам пришлось щелкнуть правой кнопкой мыши по просмотренному отчету, чтобы вернуть некоторый внутренний фокус на отчет, чтобы они могли затем экспортировать его.Этому также помогло продление таймера до пяти минут.

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

4) В отношении другого человека, комментирующего скрипты и тому подобное для обновления схемы, смотрите Compare'Em http://home.gci.net /~mike-noel/CompareEM-LITE/CompareEM.htm.Хотя у него есть свои причуды, он создает код VBA для обновления таблиц, полей, индексов и связей.

Используйте VBA для отсоединения и повторной привязки ваших таблиц к новому целевому объекту при переключении с dev на prod.Мне потребовалось много лет, чтобы запомнить синтаксис - я просто знаю, что функция была проста в написании.

Или используйте MS-Access для связи с MS-Access через ODBC или какое-либо другое подключение для передачи данных, которое находится за пределами клиентского mdb.

Как и со всеми файловыми базами данных, вы в конечном итоге столкнетесь с проблемами при пиковом использовании или при превышении небольшого магического числа где-то между 2 и 30.

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

Что касается производительности, то данные обрабатываются на стороне клиента, поэтому вы можете захотеть использовать что-то вроде netmeter, чтобы отслеживать, сколько данных передается по проводам.Тот же принцип индексации и отказа от сканирования таблиц применим и к базам данных файловой базы.

Много хороших предложений от других людей.Вот мои 2 миллицента на сумму.Мои серверные данные находятся на сервере, доступ к которому осуществляется через сопоставление дисков.В моем случае, привод Y.Рабочие пользователи получают сопоставление с помощью сценария входа в систему с использованием active directory.Затем следующие сценарии легко выполняются с помощью пакетного файла:

  • Разрабатывайте на локальном компьютере, выполняя команду subst в пакетном файле
  • запускайте отчеты по данным за прошлые ночи, указав Y на резервный сервер (только для чтения)
  • запускайте отчеты по данным на конец месяца, указав на нужный каталог
  • тестируйте по специализированным сценариям, сохраняя специальный каталог

В моей среде (в среднем 5 одновременных пользователей, 1000 строк, а не 10 000) имело место повреждение, но оно редкое и управляемое.Только один раз за последние несколько лет мы прибегли к резервному копированию предыдущих дней.Мы используем SQL Server для наших материалов большего объема, но разрабатывать на его основе не так удобно, вероятно, потому, что у нас нет администратора SQL на сайте.

Вы также можете найти некоторые ответы на этот вопрос (как извлечь схемы из access) чтобы тоже быть полезным.Как только вы извлекли схему с помощью одного из предложенных методов, вы получаете целый ряд новых опций, таких как возможность использовать систему управления версиями для схем, а также возможность легко создавать "чистые" среды тестирования.

Отредактируйте, чтобы ответить на комментарий:Простого способа управлять исходным кодом базы данных Access в ее собственном формате не существует, но файлы схемы - это просто текстовые файлы, как и любые другие.Следовательно, вы можете проверять их в выбранном вами программном обеспечении для управления версиями и из него для упрощения контроля версий / отката.

Или, конечно, это зависит от того, что у вас есть набор сценариев, настроенных для повторного построения вашей базы данных на основе схемы.Как только вы это сделаете, обычно довольно тривиально создать дополнительную / альтернативную версию, которая перестраивает ее в другом месте, позволяя вам создавать тестовые среды из любой предыдущей зафиксированной версии схемы.Я надеюсь, это немного прояснит ситуацию!

Если вы хотите автоматически обновлять внутреннюю схему MDB при выпуске нового FE для клиентов, смотрите раздел Compare'Em http://home.gci.net /~mike-noel/CompareEM-LITE/CompareEM.htm с радостью сгенерирует код VBA, необходимый для воссоздания MDB.Или код для создания различий между двумя MDB, чтобы вы могли выполнить обновление версии уже существующего BE MDB.Это немного причудливо, но работает.

Я пользуюсь им постоянно.

Вы должны понимать, что общий mdb-файл для данных не является надежным решением.Корпорация Майкрософт предполагает, что SQL Server или какая-либо другая серверная база данных была бы гораздо лучшим решением и позволила бы вам использовать тот же интерфейс Access.Мастер миграции поможет вам произвести перенастройку, если вы захотите пойти этим путем.

Как указывал другой пользователь, произойдет коррупция.Это просто вопрос того, как часто, а не "если".

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

С системой баз данных, такой как SQL Server, Oracle, DB2.MySQL и т.д.программа базы данных выполняется на сервере и выглядит для сервера как отдельная программа, обращающаяся к файлу базы данных.Это программа базы данных (запущенная на сервере), которая обрабатывает блокировку записей, транзакции, параллелизм, ведение журнала, резервное копирование / восстановление данных и все другие приятные вещи, которые можно получить от базы данных.

Поскольку программа базы данных, предназначенная для запуска на сервере, предназначена для выполнения этого и только этого, она может делать это гораздо лучше и эффективнее, чем такая программа, как Access для чтения и записи общего файла (mdb).

Существует два правила разработки на основе реальных данных

Первое правило таково ...никогда не разрабатывайте на основе данных в реальном времени.Никогда.

Второе правило таково ...никогда не разрабатывайте на основе данных в реальном времени.Никогда.

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

Приложение работает медленно, потому что это MS Access, и ему не нравится много одновременных пользователей (где "много" - это любое число > 1).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top