Управление одновременным доступом к базе данных Apache Derby - PullRequest
2 голосов
/ 11 сентября 2009

У меня есть база данных Apache Derby, работающая (в сетевом режиме) внутри Java-приложения Swing, я подключаюсь к ней через прямые вызовы JDBC через клиентское Java-приложение.

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

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

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

Если я оставлю свойство timeslice равным 0, произойдет вызов тайм-аута getConnection, чтобы я мог отобразить сообщение для пользователя, объясняющее, что ему необходимо отключить одно из клиентских приложений.

Являются ли потоки соединения надежным способом сделать это?

Мне не хватает другого решения?

Ответы [ 2 ]

0 голосов
/ 21 октября 2009

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

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

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

0 голосов
/ 12 сентября 2009

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

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

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

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

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