Страница 1 из 1

Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 10:16
Игорь Столяров
Привет всем !

Возник вроде бы простой вопрос, нужно сделать "Приложение для монопольной работы с БД".
Но оказалось, что не все так просто.
Т.е. нужна программа, которая может работать с БД только в режиме монопольного доступа к данным.
Рассмотрим варианты решения задачи и почему они не решают вопрос.

1. Если задаем для списков БД режим монопольного доступа (Open() вместо Share()) - то нельзя внутри программы открыть например 2 Browse одного файла.
2. Делать файлы с флагами доступа к БД не хочется - при аварийном завершении работы программы, нельзя запустить ее повторно, без разблокировки.
3. Контроль запуска приложения не дает результата, т.к. программа может запускаться с разных компьютеров в сети или терминальных сессий.
4. ... и все. Или есть еще какие-нибудь варианты решения вопроса ?

Re: Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 10:47
Ал
Привет!
1.Контроль запуска - в том числе и монополии - где то в самих базах..
2.Учет сеанса/действий в процессе работы - где-то в самих базах... и набор действий проги при след запуске при различных результатах пред. сеанса - норма/сбой связи/сбой по питанию-вырубили комп/...

Re: Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 12:27
kreator
Предлагаю наш опыт. Сделано, правда, по-простому, без заморочек. У нас Firebird, изначально от был без всяких админских штучек. Мы отслеживаем кол-во вошедших пользователей, поскольку продаём лицензии на каждый вход. Ну и вот, есть таблица, куда падает запись вошедшего (он входит по паролю, естественно). При его выходе его запись удаляется. Тут проблема, если неправильный выход. После праздников я могу это выяснить (не моя тема), но, думаю, можно что-нибудь придумать, например, реакция на время работы. Можно ещё покопать в сторону определения ip адреса, кто открывает, если открытие на локальной станции. если на сервере, то не вариант.
А ещё идея такая (пока писал пришла мысль). При загрузке программы открываешь одну таблицу в монопольном режиме (таблица не рабочая). Первый пользователь её открыл. Для второго пользователя проверяешь открытие этой таблицы - если открыта, то до свидания. А рабочие таблицы открываются в нормальном режиме.
Вообще, мне кажется, монопольный режим идёт из ДОСа. Сейчас надо как-то по-другому.

Re: Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 12:37
Игорь Столяров
Это все разнообразные флаги блокировки (через запись или блокировку контрольного файла).
В п.2. я как раз упомянул, что здесь есть проблема с аварийным завершением работы программы.

Что касается IP адреса - то это не решает проблему повторного запуска программы на одной рабочей станции.

Действительно, помню, что под DOS проблемы с монопольным доступом не было.
Но там и не было возможности внутри одного приложения работать с несколькими MDI потоками ... ;)
Наверно вопрос к этому и сводится: как различить многопользовательский доступ к БД из одной копии программы и из разных.

Re: Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 13:35
Алексей- Софт-Центр
Добрый день!
Вероятнее всего это lock / unlock пользователей средствами БД
Те входите программой с юзером администратором, который просто блокирует всех пользователей
до завершения своей работы
потом разблокирут
в случае аварийного завершения- просто запускается разблокировка пользователей


Алексей

Re: Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 14:10
kreator
а почему не годится мой последний вариант? Если программа с захваченной монопольным доступом таблицей некорректно выходит, то ничего страшного не происходит - таблица/файл всё равно закрывается. Другое дело, если сервак, где лежат файлы, не отрабатывает. У нас в конторе проблема - exe-шник и dll-ки не освобождаются от захвата при выходе из программы (они лежат на серваке). Пока мы не разобрались в чём дело. Это не каждый раз, и не с определённых станций, в общем системы какой-то не просматривается. Тем более, что в оборудовании зоопарк - станции на XP и Win7, сервер - виртуальный Win2012R2 через WMWare (кажется).

Re: Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 14:56
Алексей- Софт-Центр
Добрый день!
Кто сказал , что не годится?
все варианты, которые приводят к решению поставленной задачи, имеют право на жизнь. :)
Во всех базах данных (оракл, скл, и т д) есть готовое решение типа лок. можно, конечно,
средствами клариона сделать аналог, но для чего?
Если оно чем-то не устраивает-то да, если все подходит-то ...?


Алексей

Re: Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 14:59
Игорь Столяров
То, что в серьезных БД этот вопрос решен - сомнений не вызывает.
Речь идет о приложении, например с TPS БД.

Re: Приложение с монопольным доступом к БД

Добавлено: 01 Ноябрь 2014, 15:20
Алексей- Софт-Центр
Добрый день!
Игорь
Тогда здесь возможны любые варианты.
Например, моделируя лок базы данных.
В файле пользователей программы добавляете поле блокировки
опять таки , запуская прогу в режиме админа, он взводит флаги блокировки пользователей, кроме своего.
Тогда п.2 вашего поста несущественен .
Правда, не зная структуры Вашей базы, мы просто философствуем на эту тему.
(возможно у Вас просто нет файла пользователей :) )

Алексей

Re: Приложение с монопольным доступом к БД

Добавлено: 02 Ноябрь 2014, 9:58
kreator
Если в "Global Properties" в настройках таблиц поставить "File Open Mode" "Open", а "File Attributes"/"Threaded" - "None Threaded", то проблема №1 снимается, можно открыть два треда по одной таблице.

Re: Приложение с монопольным доступом к БД

Добавлено: 02 Ноябрь 2014, 10:05
Игорь Столяров
Ух ты ! А вот это действительно интересно, спасибо. Пошел пробовать ...
Подозреваю, что такая комбинация может решить еще один вопрос: работа MDI приложения с драйвером SQLite (который по своей сути монопольный).

Re: Приложение с монопольным доступом к БД

Добавлено: 02 Ноябрь 2014, 18:22
Yufil
Я в каталоге программы завожу подкаталог Lock и даю в него доступ всем.

Программа при запуске:

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

Эта же операция может быть повторена b при открытии файла БД.

2. Программа заводит файл <userno>.<computername>.lock, где username - код пользователя, computername - погоняло компа, после чего тут же открывает его монопольно.

По концу программы этот файл закрывается и удаляется.
При аварии файл остаётся, но будет удалён при первой же попытке доступа к БД.

Re: Приложение с монопольным доступом к БД

Добавлено: 02 Ноябрь 2014, 18:28
Игорь Столяров
Все очень здорово, но можно пояснить ключевую фразу (последнюю):
Yufil писал(а):При аварии файл остаётся, но будет удалён при первой же попытке доступа к БД.
Насколько я знаю, при аварийном завершении программы, контрольный файл на сервере "<userno>.<computername>.lock"
останется заблокированным. И удалить его можно будет только после сброса блокировки на сервере (ну или его перезугрузке).
Или я не прав ?

Re: Приложение с монопольным доступом к БД

Добавлено: 02 Ноябрь 2014, 18:55
Yufil
Дык, программа начинается с попытки удалить ВСЕ файлы из каталога. Если файл не заблокирован (например, если прога слетела), его удалить можно, а если заблокирован-отнюдь.
Поэтому список неудалённых файлов показывает, кто в данный момент сидит в программе.

Re: Приложение с монопольным доступом к БД

Добавлено: 02 Ноябрь 2014, 18:57
Yufil
Этот механизьм опробован и лет десять как юзается