【问题标题】:Best practices for JavaFX desktop application communicating with a remote server [closed]JavaFX 桌面应用程序与远程服务器通信的最佳实践 [关闭]
【发布时间】:2017-01-12 08:18:49
【问题描述】:

我需要有关在 JavaFX 中设计桌面应用程序与远程服务器通信的最佳实践方面的建议。由于我主要有开发 Web 应用程序的经验,因此我需要了解常见问题,并且需要了解在开发桌面应用程序时应考虑的问题。

问题描述及要求:

这是一款供员工查看数据、进行报告并根据其角色执行多项其他操作的应用程序。

  • 此应用程序将为超过 10 名员工安装,以后可以增加#。
  • 每个员工都应该能够登录和使用该应用程序(多个员工可以同时使用该应用程序)。
  • 每个员工对数据进行的任何修改都将被记录下来,以备日后跟踪。
  • 应用程序将根据每个用户的角色以不同的方式显示。
  • 由于此应用程序将安装在多台计算机上,员工可以从不同的计算机登录到应用程序,他们将通过登录来识别。

建议的解决方案:

在以下情况下是否被认为是一种好习惯:

  • 我使用 Mysql 作为后端数据库?
  • 我创建了一个连接到数据库的中间服务器 允许客户端应用程序连接到服务器并交换 数据通过它员工使用的每个应用程序实例应该 直接与托管在另一个数据库上的数据库建立连接 服务器在同一个本地网络上?

【问题讨论】:

  • 听起来不太难,JavaFX 是您完成任务的绝佳选择(恕我直言)。但是您应该注意线程,因此中间服务器是跟踪数据库更改的不错的解决方案。
  • 我同意@MartinPfeffer,因为您可以在中间服务器中处理诸如数据一致性之类的事情
  • 您是否在网上看到任何遵循相同架构的 JavaFX 桌面应用程序示例?
  • @gnat 好的,我明白了。非常感谢您提供的链接。考虑到这一点,这个问题不是很适合这两个网站吗?因为它的类型是“这是我的问题。有人有解决方案吗?”!?
  • @gnat 我编辑了帖子,试图缩小其范围并使其符合规则。请查看它,如果合适,请考虑重新打开它。

标签: java javafx desktop-application


【解决方案1】:

一个应用程序的架构有许多需要考虑的组件,并且可以通过多种方式进行设计,因此该问题没有明确的答案,但在设计一个应用程序时应该考虑一些重要的点。在开发桌面应用程序时,您应该考虑它与 Web 应用程序的主要区别,并尝试解决它们带来的挑战。

  • 网络(或 Internet)连接:桌面应用程序可能不会一直有活动的网络连接,所以除非您想要您的 程序在活动连接不可用时使每个事务失败,它 应该有它的本地嵌入式数据库(如 h2),然后同步 当活动连接可用时,远程服务器中的 Web 应用程序的数据(不要连接到远程数据库 直接因为服务器端验证、负载平衡等!)。

    桌面应用程序本质上是独立的,所以如果不能 没有互联网连接的功能那么它有什么意义 作为桌面应用程序?

  • 同步:上一点建议你应该有一个本地 数据库并将其与远程服务器应用程序同步。请记住 同步应该有两种方式:A)发送本地数据到服务器 B)从服务器接收数据并将其保存在本地数据库中。这 如果数据模型复杂且充满依赖关系,可能会很棘手 因为依赖实体需要同步在一起并且它 在连接失败等事件中增加同步操作的风险或 电力流失。还应考虑数据模型的更改。所以尝试:

    • 将您的数据模型设计得尽可能少。
    • 避免实体之间的依赖关系。
    • 避免在数据模型中对跨用户交互进行建模,因为它打破了应用程序设计为由用户使用而与其他用户无关的假设(在桌面应用程序中通常是这种情况。)
    • 设计一个同步协议,考虑数据模型的变化,并可能需要在同步开始之前更新程序。
  • 更新:桌面应用程序通常需要定期更新。你有 在设计架构的所有步骤中牢记这一点, 特别是在设计高级模块时,它们应该是 尽可能独立,以便它们可以独立更新。您还需要设计一个更新方案来处理这个要求。

  • 多线程: JavaFx 和大多数桌面框架(我知道 of) 有一个驱动应用程序和 UI 组件的主线程 在里面更新。耗时的操作,如同步和 数据库事务不应在主线程中完成,因为它们会导致 要冻结的程序。它们应该在单独的后台运行 线程并定期通知他们的进度到mian线程。

  • 数据库会话: 在 Web 应用程序中打开会话视图是一种流行 数据库会话的策略,但实现它可能很棘手 对于桌面应用程序。请记住,通常这不是一个好主意 整个应用程序的单个会话,因为您不应该保留 会话开放很长时间(如果您是 例如使用休眠)。

  • 通知:最好实施通知系统来定期检查远程更改并通知用户。

【讨论】:

  • +Thumbs Up for LocalDb 和 Sync 以及数据库会话,确实是个好主意..
【解决方案2】:

我说创建一个中间服务器是完全必要的。如果您不确切知道将使用该应用程序的用户数量,如果它突然从 10 个用户扩展到 100 个用户,它将杀死您的数据库。此外,数据库连接对延迟非常敏感,并且交换了许多消息,因此后端服务器离数据库越“近”,它的性能就越好。 (从直接通过 3G 网络访问 MySQL 数据库的经验来看。必须迁移到 REST 才能使其可靠地工作)。

据我了解,您已经熟悉 Java,我会选择以下架构:

  • 数据库:(MySQL、PGSQL、MSSQL...)
  • 后端服务器:Spring Boot 可能是一个不错的选择。

    • JPA(Eclipselink 或 Hibernate)存储库
    • 在服务级别实现业务逻辑
    • REST 接口
    • 处理身份验证和令牌。
  • 前端:JavaFX

    • 与 bakend 的 HTTP 通信。 JavaFX 中没有实现业务逻辑。仅与后端接口。

该架构将允许在一个中心位置更新业务逻辑,而无需关心最终用户拥有哪个版本的应用程序。另外,我建议对 API 进行版本控制(例如 http:///api/v1/...)以避免不兼容。

当然,您可以尝试使用spring-data-rest-webmvc 直接通过REST 直接公开您的数据库模型。如果您的数据库已经正确设计,则在 Netbeans 中只需单击几下即可提取模型并准备好应用程序以通过 REST 公开您的模型;然后,需要在客户端实现业务逻辑。老实说,如果将来需要维护项目,请不要使用此解决方案并在服务器中实现逻辑。

【讨论】:

  • 是的,你说得对,我最终会考虑增加用户,我不适合直接使用数据库连接,因为它肯定会杀死我的数据库。+为更接近的后端服务器竖起大拇指,我也在寻找它,我实际上想在同一台机器上托管数据库和后端服务器正在寻找建议是否是个好主意..
猜你喜欢
  • 2020-05-02
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多