在 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 秒。
这对我来说很好,我希望这也能对其他开发者有所帮助。
我正在开发 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 秒。
这对我来说很好,我希望这也能对其他开发者有所帮助。