我正在开发一个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条记录。
这对我来说很好,我希望这对其他开发人员也有帮助。