Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Web服务SocketTimeOutException导致数据库不一致_Android_Web Services_Ruby On Rails 3.2_Http Post_Httpclient - Fatal编程技术网

Android Web服务SocketTimeOutException导致数据库不一致

Android Web服务SocketTimeOutException导致数据库不一致,android,web-services,ruby-on-rails-3.2,http-post,httpclient,Android,Web Services,Ruby On Rails 3.2,Http Post,Httpclient,在ApacheHTTP客户端库的帮助下从Android设备调用RailsWeb服务时,我希望克服以下情况 情景: 客户端(Android):启动HTTP POST请求(使用ApacheHTTP客户端,JSON作为交换格式),将少量记录插入服务器数据库(MySQL) 服务器(Rails中的Web服务):处理请求并将记录成功插入数据库,但同时超时(SocketTimeOutException)发生在客户端 客户端(Android):超时时,重试执行相同的HTTP POST请求,并再次将相同的记录ge

在ApacheHTTP客户端库的帮助下从Android设备调用RailsWeb服务时,我希望克服以下情况

情景:

客户端(Android):启动HTTP POST请求(使用ApacheHTTP客户端,JSON作为交换格式),将少量记录插入服务器数据库(MySQL)

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

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

有谁能帮我克服这种情况吗

提前谢谢

编辑:

我当前的情景:

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

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

3) 轰!!数据插入MySql数据库,但由于某种原因,Android端存在
SocketTimeOutException
,因此Android端没有用户ID,用户尝试再次注册。。。。。。。。数据库不一致,我很难过:(


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

对于您上面描述的特定情况,我建议您在程序中添加会话cookie。当用户发布数据时,您检查该会话是否已经有用户ID,如果已经有,则返回该ID,如果没有,则执行数据库插入。因此,即使发生了初始插入,然后在用户获得响应之前超时,您也可以在用户重试注册时提供响应。不会让你的数据库被破坏

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

编辑前:

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

这是一个您可能无论如何都必须处理的问题,因为两个客户端可能同时发布相同的信息,即使您没有重新发布的问题


如果你想更详细地描述这篇文章的工作原理,你必须提供更多关于文章内容的信息。在本例中,键和唯一字段很有趣,关于记录是否绑定到特定用户等的任何信息也很有趣。

请尝试使用以下代码

HttpParams httpParameters = new BasicHttpParams();
            int timeoutConnection = 30000;
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
            int timeoutSocket = 30000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
            HttpClient httpclient = new DefaultHttpClient(httpParameters);
            HttpPost httppost = new HttpPost(url);
            StringEntity se = new StringEntity((JSONRequest));
            httppost.setEntity(se);
            httppost.setHeader("Accept", "application/json");
            httppost.setHeader("Content-type", "application/json; charset=utf-8");
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            strResponse = httpclient.execute(httppost, responseHandler);
HttpParams httpParameters=new BasicHttpParams();
int timeoutConnection=30000;
HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection);
int timeoutSocket=30000;
HttpConnectionParams.setSoTimeout(httpParameters,timeoutSocket);
HttpClient HttpClient=新的默认HttpClient(httpParameters);
HttpPost HttpPost=新的HttpPost(url);
StringEntity se=新的StringEntity((JSONRequest));
httppost.setEntity(se);
setHeader(“接受”、“应用程序/json”);
setHeader(“内容类型”,“应用程序/json;字符集=utf-8”);
ResponseHandler ResponseHandler=新BasicResponseHandler();
strResponse=httpclient.execute(httppost,responseHandler);
根据您的要求设置超时。

#规则始终允许php和mysql脚本在客户端(Android或任何其他)之前超时。您可以通过在系统的所有端点上适当设置超时来轻松确保这一点

特别是对于您的场景,您可以向users表中添加布尔值,并将其命名为verified

  • 当用户注册时,默认情况下未设置verified(
    verified=false
  • 当用户第一次登录时,将设置验证(
    verified=true
  • 当用户注册且指定的
    用户名
    已存在时,如果已验证==false,则允许注册,否则不允许注册
  • 成本)当用户注册时,他应该登录。最好删除注册页面,并向用户显示一个视觉指示器,表明注册已完成,现在我们正在让您登录。我通常在注册时显示一个进度对话框,说“注册…”,然后转到登录页面,向用户显示一个进度对话框,说“登录…”
  • 这将确保问题不再发生。如果登录屏幕上出现错误(超时),用户应留在该屏幕上,以便重试。这在android上确实是一个正常的流程(Intent)


    • 当然,您可以在注册页面上强制登录保持静默,并不断重试,直到成功
    • 您还可以删除额外的登录步骤,只需在第一次交易时验证用户,但这将花费很多(您必须检查每个请求)
    我认为基于会话的web服务是您所需要的。。因此,只有当服务器成功完成时,会话才会过期。您可以吗