我在Java swing应用程序中运行了一个Apache Derby数据库(在网络模式下),我通过java客户端应用程序通过直接JDBC调用连接它。

这一切都非常好并且工作得很好但是我知道还需要为此客户端/服务器应用程序实现并发许可证。

理想情况下,拥有单个用户许可证的用户应该能够在笔记本电脑上运行1个客户端应用程序,并且还能够在桌面上运行第二个客户端应用程序,并且能够从两个客户端连接到服务器。

我没有网络服务器的奢侈品,所以我想知道我唯一的选择是使用“maxthreads”吗? Derby中的运行时属性并且基本上迫使用户必须注销笔记本电脑,如果他们想要从他们的桌面使用该应用程序。

如果我将timeslice属性保留为0,那么将调用getConnection超时,这样我就可以向用户显示一条消息,说明他们需要断开其中一个客户端应用程序。

连接线程是否是一种可行的方法?

我错过了另一种解决方案吗?

有帮助吗?

解决方案

如果我正确理解了这个问题,那么您拥有用户锁定的许可证,并希望阻止具有单个许可证的单个用户访问“服务器”。一次来自客户端的多个实例。你的“服务器”它只是一个数据库,您不希望在服务器端创建应用程序层。

我真的不喜欢您使用线程池和连接超时来强制执行许可限制的初步建议,因为这些内容都用于其他目的。

相反,为了解决这个问题,我可能会考虑要求用户在第一次使用它时将许可证号输入GUI。这可以保存在用户的主目录中,以便随后启动GUI。如果他们第一次在另一台机器上启动GUI,也会发生同样的情况。然后,对于GUI对数据库进行的每个事务,它将首先更新许可证表或类似事件以指示用户的许可证当前正在参与事务。只要表中已有相同的许可证,标记为活动或类似,GUI就会拒绝该交易并向用户显示其许可证已被其他客户使用。

如果你喜欢这个想法,那就认为它比我想象的还要远。我可以看到永久逻辑锁定用户的一些错误:-)

其他提示

您似乎想要执行“登录”操作和“退出”数据库是显式的,所以也许您可能希望在数据库中有一个特殊的表,您的应用程序在您登录或注销时写入记录。

然后,您的应用程序可以查询该表以查明当前是否登录了该应用程序的其他副本。

您可能希望在表格中包含其他字段,以跟踪登录/注销时的日期/时间,执行登录/注销的客户端的主机名和IP地址等。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top