Java Cloudant在文档更新时返回500 function_子句错误,但实际成功
我有一个在Bluemix中运行的Java/Liberty应用程序,它使用Cloudant数据库作为Bluemix服务 应用程序对Cloudant中的文档进行更新。在晚上,其中一个更新失败,出现了一个500 function_子句错误。不幸的是,我们没有记录提交的确切数据,但在本例中,我认为这并不重要,因为请求似乎已实际成功,这意味着提交的数据实际上没有任何问题。我们的日志显示在以下几分钟前成功更新了同一文档:Java Cloudant在文档更新时返回500 function_子句错误,但实际成功,java,couchdb,cloudant,ibm-cloud,Java,Couchdb,Cloudant,Ibm Cloud,我有一个在Bluemix中运行的Java/Liberty应用程序,它使用Cloudant数据库作为Bluemix服务 应用程序对Cloudant中的文档进行更新。在晚上,其中一个更新失败,出现了一个500 function_子句错误。不幸的是,我们没有记录提交的确切数据,但在本例中,我认为这并不重要,因为请求似乎已实际成功,这意味着提交的数据实际上没有任何问题。我们的日志显示在以下几分钟前成功更新了同一文档: [4/23/15 6:02:47:790 UTC] 00011bf6 Cloudant
[4/23/15 6:02:47:790 UTC] 00011bf6 CloudantDBCon I Storing object: <mydoc> revision: 28786-84dc6b5f33dc3c54041bd430ecfd3db7
[4/23/15 6:02:47:844 UTC] 00011bf6 CloudantDBCon I RESTResponse:201:{"ok":true,"id":"<mydoc>","rev":"28787-f932d7d249fd6d36d8b0e692f6e77abd"}
您至少可以从中看出它与跟踪语句的匹配情况,即对象中的修订是正确的
最基本的问题是为什么Cloudant执行了更新,但返回500却声称没有执行更新?在更新文档时,您应该始终确保您拥有最新版本。它确实拥有最新版本。如果您查看上面引用的第一次成功更新的响应,第二次失败的更新将使用正确的下一版本。其间没有更新。正如我在问题中提到的,更新实际上是在数据库中进行的,因此错误返回似乎是错误的。你能分享你的一些代码吗?没有一点代码就很难调试。如中所述,“function_子句”错误可能表明JavaScript有问题。查看map/reduce函数以查找错误。是否有可能来自多个应用实例的并发更新在Cloudant中发生冲突,其中一个成功,但另一个失败了?@jimmc,谢谢,我看过这篇文章,但我认为它不适用于这里。因为问题很少发生,而且调用实际上成功了,尽管它报告了失败,所以我们的代码似乎不太可能有问题。有人建议我使用Cloudant支持打开一张票证,我会这样做。如果他们有任何决定,我会再发一次。
[4/23/15 6:03:03:215 UTC] 00011cc9 CloudantDBCon I Storing object: <mydoc> revision: 28787-f932d7d249fd6d36d8b0e692f6e77abd
[4/23/15 6:03:10:171 UTC] 00011cc9 CloudantDBCon I RESTResponse:500:{"error":"function_clause","reason":null,"ref":1199554705}
[4/23/15 6:05:39:605 UTC] 00011b5e CloudantDBCon I Storing object: <mydoc> revision: 28788-306b2753e972f9d664d22cfadd9b0f3d
[4/23/15 6:05:40:368 UTC] 00011b5e CloudantDBCon I RESTResponse:201:{"ok":true,"id":"<mydoc>","rev":"28789-0325241da136f39780ff4b2f97438182"}
public void storeObject(String id, JSONObject obj) {
try {
String rev = null;
try {
rev = obj.getString("_rev");
} catch (JSONException jse) {
rev = "none";
}
log.info("Storing object: " + id + " revision: " + rev);
RESTResponse response = RESTClient.RESTRequestWithRetry(REQUEST_METHOD_PUT,
URL + "/" + id,
obj.toString(),
username,
password,
RETRY_INTERVAL);
log.info("storeObject: " + response.toString());
...