2

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

这一切都很好,而且效果很好,但是我知道为这个客户端/服务器应用程序实现并发许可证还有一个额外的要求。

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

我没有网络服务器的奢侈,所以我想知道我唯一的选择是否是在 Derby 中使用“maxthreads”运行时属性,并从本质上强制用户必须注销笔记本电脑,说他们是否想然后使用从他们的桌面应用程序。

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

连接线程是一种可靠的方法吗?

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

4

2 回答 2

0

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

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

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

如果您喜欢这个想法,请比我想得更远。我可以看到将用户永久锁定在逻辑之外的一些错误:-)

于 2009-09-11T20:39:24.080 回答
0

It seems like you want to make the action of "logging in" and "logging out" of the database explicit, so perhaps you may want to have a special table in the database where your application writes a record when you log in or out.

Then your application can query that table to find out if other copies of the application are currently logged in.

You might want to include additional fields in the table to track the date/time when you logged in/out, the hostname and IP address of the client which performed the login/logout, etc.

于 2009-10-21T04:17:48.637 回答