在Java webservice (REST vs WebSocket)中发送大量记录的最佳选择



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

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

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

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

今天我正在使用一个带有JSF页面和JAX-RS (Jersey)的Java Web应用程序与Android通信。对于数据库,我使用PostgreSQL 9连接通过JPA (EclipseLink)。

在我正在做的测试中,通过REST发送所有这些数据对我来说似乎是有问题的,因为这个过程很长。我有超时问题除此之外。

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

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

因此,用户不确定进程是否成功。等待很长时间后,插入端和用户才能确认进程成功。

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

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

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

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

在Android应用程序中,我使用以下设置:

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

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

服务器端:

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

服务器接收压缩数据并存储到磁盘。在调度任务解压缩并插入数据库后。这个过程需要15到20秒,到50,000条记录。

这对我来说很好,我希望这对其他开发人员也有帮助。

相关内容

  • 没有找到相关文章

最新更新