gpt4 book ai didi

android - Web服务SocketTimeOutException导致数据库不一致

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:12:54 27 4
gpt4 key购买 nike

我想在 Apache HTTP 客户端库的帮助下从 Android 设备调用 Rails Web 服务时克服以下情况

场景:

客户端(Android):发起HTTP POST请求(使用Apache HTTP客户端,JSON作为交换格式)向服务器数据库(MySQL)插入少量记录。

服务器(Rails 中的 Web 服务):处理请求并将记录成功插入数据库,但同时超时 (SocketTimeOutException) 发生在客户端。

客户端(Android):超时,重试执行相同的 HTTP POST 请求,并再次将相同的记录插入数据库并发生数据库不一致。

谁能帮我克服这种情况。

提前致谢

编辑:

我目前的情况:

1) 用户尝试通过填写和提交数据来使用 Android 应用程序进行注册。所以基本上 POST 服务包含所有需要的用户,发送到服务器(Rails 和 MySql)

2) POST 请求由服务器处理,这个过程主要负责将记录插入数据库,并使用插入数据的 USER_ID 向客户端提供响应。

3) 砰!!数据已插入 MySql 数据库,但由于某种原因,Android 端出现 SocketTimeOutException,因此 Android 端没有 USER_ID,用户尝试再次注册...... . 数据库不一致,我很伤心 :(

注意:步骤 3) 的发生非常罕见。但是当服务器太忙或有一些处理负载时,它会经常发生。

最佳答案

对于您在上面描述的具体情况,我建议您将 session cookie 添加到程序中。当用户发布数据时,您检查该 session 是否已经存在 USER_ID,如果是,则返回它,如果不是,则进行数据库插入。因此,即使发生初始插入,随后在用户获得响应之前超时,您也可以在用户重试注册时提供响应。不会破坏您的数据库。

您还可以在数据库中查找相同(或唯一)的记录(最近创建的),并在第二次请求时返回该 USER_ID。这将取决于用户发送的数据。但是,如果这是一次注册,并且您在很短的时间内连续收到两个具有相同电子邮件的帖子,那么可以肯定的是,它来自同一用户......

编辑前:

由于您使用的是 Rails,因此您可以简单地利用 create_or_update创建记录的方法。基本上,您检查记录是否已经存在,然后更新它们,而不是盲目地插入新记录。

这是一个您可能不得不处理的问题,因为即使您没有转发问题,两个客户也可能同时发布相同的信息。

如果您想更详细地了解其工作原理,您必须提供有关帖子包含内容的更多信息。在这种情况下,键和唯一字段以及有关记录是否绑定(bind)到特定用户等的任何信息都很有趣......

关于android - Web服务SocketTimeOutException导致数据库不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14603642/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com