Страница: 1 |
Страница: 1 |
Вопрос: Клиент-сервер
Добавлено: 06.09.04 05:52
Автор вопроса: Mihalыch | ICQ: 373-509-101
Такой вопрос: есть локальная сеть, на компьютерах которой установлены клиентские модули программы, один из компьютеров работает как сервер, на нем находится база данных Access, в которую клиентские модули через DLL расположенную на «сервере» передают данные. Скорее всего, в случае одновременной записи данных в базу произойдет ошибка. Как это обойти?
Помогите, кто может! Заранее благодарен!
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #1
Добавлено: 06.09.04 08:10
Может как-нибудь выстраивать их в очередь?
Типа If Server.IsBusy then <в очередь>. Ну или что-то в роде этого.
Номер ответа: 2
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #2
Добавлено: 06.09.04 08:22
В том то и дело, как выставить? Я делал так перед тем как клиент начинает передавать данные создаю в корне сервера «сигнальный файл», а по окончании удалю его. Но как-то это не очень!
Номер ответа: 3
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #3
Добавлено: 06.09.04 08:31
Я бы сделал еще один Winsock/Тягу/др. для обработки этого запроса. Он всегда подключен и запрашивает состояние. Или так: отсылать всем клич, типа: "Свободен", и кто первый успел, то тот коннектится и сервер дает еще один клич, что он занят. Наверное так...
Номер ответа: 4
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #4
Добавлено: 06.09.04 08:54
Из второго варианта можно попробовать ченить выжать. Но все равно, я понимаю так: когда один клиент передает dll’ке «дату» для записи в базу, он грузит ее в «свое адресное пространство», другой тоже и еще другой тоже и так далее т.е. ента млин dll’ка ни че не знает о том, что кто то уже пишет в базу. Вот если бы можно было бы спросить у базы, чем она шас занимается!? А вообще слышал, что есть какая то программа от мелкомягких, которая и устраивает енту очередь. Может подскажешь где такое можно взять, вроде она входит в стандартный набор Виндовс?
Номер ответа: 5
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #5
Добавлено: 06.09.04 09:13
Эх, знать бы мне ее название - сказал бы его...
Номер ответа: 6
Автор ответа:
ol2003
Вопросов: 3
Ответов: 122
Профиль | | #6
Добавлено: 07.09.04 06:09
База данных закрывает таблицу на время внесения записи. Поэтому одновременное внесение 2-х и более записей невозможно. Не забивай сесбе этим голову.
Номер ответа: 7
Автор ответа:
Born
ICQ: 178155071
Вопросов: 21
Ответов: 52
Профиль | | #7
Добавлено: 07.09.04 06:34
А если транзакцию создавать когда пишишь в базу и монопольно держать таблицу. Тогда другой будет ждать..
Номер ответа: 8
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #8
Добавлено: 10.09.04 10:58
См. LockTypeEnum (ADODB): н-р, adLockPessimistic, если ты так боишься ошибок. Константы LockType определяют, как поведет себя твоя многопользовательская база в конфликтных ситуациях. См.тж. CursorTypeEnum: н-р, adOpenDynamic... Все конфликтные ситуации база разрешает сама, тебе правда надо при этом грамотно обрабатывать сообщения об возникающих ошибках блокировки. Удачи!
Номер ответа: 9
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #9
Добавлено: 10.09.04 18:18
Транзакция используется, но это не помогает, нет окат конечно происходит, но после этого приходится снова вызывать процедуру сохранения данных. Всевозможные типы курсора adLockPessimistic и режимы открытия объекта Connection adModeShareDanyWrite, adModeShareExclusive и т.д., как мне кажется, действуют только в контексте конкретного экземпляра объекта Connection. Т.е. когда очередной клиентский модуль делает Dim cnnConnection As New ADODB.Connection, то этому New cnnConnection абсолютно феалетово какие кто-то установил режимы, свойства. Возможно я ошибаюсь.
А вообще решение проблемы есть! Правда еще до конца не разобрался. Но то, что уже известно выглядит так: при создании dll в меню Project нужно выбрать команду Project Properties, на вкладке Component нужно поставить птицу в CheckBox’е Remote Server Files. Тогда после компиляции будет создан файл с расширением *.vbr. Далее при создании инсталлятора для серверного модуля необходимо захватить dll’ку, а при создании инсталлятора для клиента этот файл. Далее: сначала инсталлируем серверный модуль, после чего во время инсталляции клиента (во всяком случае VBшный Package… это делал) будет предложено указать имя компьютера, на котором зарегистрирована dll’ка. После этого св-ва, методы, события dll’ки будут доступны даже во время отладки на клиентской машине, хотя самой dll’ки на этом компьютере нет. Это с чем разобрался.
А вот с этим пока нет: для установления очереди есть специальная библиотека для того, что бы она появилась в References необходимо в панели управления в Установке и удалении программ выбрать установка компонентов Windows, а там выбрать Очередь сообщений и установить весь состав. Потом в меню Project нужно выбрать команду References и подключить библиотеку Microsoft Queue 3.0 Object Library, дальше
 im myQueue As MSMQQueueInfo
Set myQueue = New MSMQQueueInfo
myQueue.Create 'дальше пока не знаю
Согласен, как то очень запутано, но вдруг сработает. Может кто знает то чего я не знаю. За помощь, сочувствие или просто проявленный интерес всем спасибо!
Номер ответа: 10
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #10
Добавлено: 11.09.04 14:36
Вопрос: про какую dll ты говоришь, если честно я не знаю? Про MSMQQueueInfo я вряд ли подскажу. Просто раз ты делаешь такую серьезную сетевую программку, может тебе писать её не под Access, а под MS SQL Server? Ведь одна из основных его задач-целостность данных в многопользовательской среде.
>после этого приходится снова вызывать процедуру сохранения данных
И ещё, если записи заблокированы есть два выхода: повторять попытки какое-то время, если время истекает - отменять действия транзакции совсем. Или можно сразу говорить пользователю, что запись заблокирована другим пользователем и пусть он или ждет, или отказывается от того, что хотел первоначально сделать. Короче, в клиентской части д.б. обработка ошибок транзакций. Основательная такая!