在 Java Web 服务中发送大量记录的最佳选择(REST 与 WebSocket)

Best choice for sending large amount of records in Java WebSerivce (REST vs WebSocket)

我正在开发 Android 的应用程序,用于农业机械。

此应用程序平均每分钟生成 10 到 40 个日志。

20 小时后,SQLite 中将存储 12,000 到 48,000 条记录。

我的问题是关于使用 Internet 将这些记录提交到服务器的最佳选择。

今天我使用 Java Web 应用程序与 JSF 页面和 JAX-RS(泽西岛)进行通信 Android。对于数据库,我使用通过 JPA (EclipseLink) 连接的 PostgreSQL 9。

在我正在进行的测试中,在我看来,通过 REST 发送所有这些数据似乎是有问题的,因为这个过程很长。我有超时问题 等等。

尝试解决问题并确保数据一致性。我是分页发送数据,发送完所有记录才开始插入数据库

这解决了部分问题,但我不确定这是否是最佳方法。服务器上的数据插入时间较长,由于超时,Android 无法等待进程完成。

因此,用户不确定该过程是否成功。等待很长时间,插入结束,用户才能确认处理成功。

它还会产生其他问题,因为我必须阻止用户执行新的发送数据,直到它收到前一个过程的确认。

这种情况的最佳解决方案是什么?

我打算看的解决方案之一是 WebSocket,但想了解其他开发人员的经验。

经过一些测试和评估,我得到了一个很好的解决方案。将记录上传和存储到服务器的过程不到 40 秒。

在 Android 应用程序中,我使用了以下集合:

  • Realm database存储数据:它的优点是运行一次查询时不会把所有数据加载到内存中。数据按需加载。
  • Jackson序列化为Json:它的优点是将数据序列化,按需写入文件。我必须创建一个自定义序列化程序。
  • GZIPOutputStream压缩数据:允许Jackson写入压缩数据。
  • Retrofit上传数据:因为漂亮:)

这组的结果对我来说非常好。可以在大约15秒内读取、压缩并发送50,000条Android的记录到服务器。压缩后的数据约为400KB。

在服务器中:

  • JPA & EclipseLink + PostgresSQL 存储数据: 通过一些额外的设置,您可以获得出色的性能。
  • Jackson 反序列化 Json:我必须创建一个自定义反序列化器。
  • GZIPInputStream 解压缩数据: 允许 Jackson 读取压缩数据。
  • Jersey 接收请求: 是一个很好的与 CDI + EJB 一起工作的实现。

服务器接收压缩数据并存储到磁盘。安排任务解压缩并插入数据库后。处理 50,000 条记录需要 15 到 20 秒。

这对我来说很好,我希望这也能对其他开发者有所帮助。