Управление параллельным доступом к базе данных Apache Derby

StackOverflow https://stackoverflow.com/questions/1412976

Вопрос

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

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

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

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

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

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

Я упускаю из виду другое решение?

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

Решение

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

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

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

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

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

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

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

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

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