gpt4 book ai didi

java - 谷歌应用程序引擎在第一次坚持后默默地坚持失败

转载 作者:行者123 更新时间:2023-11-30 05:02:45 25 4
gpt4 key购买 nike

我有一个 servlet,可以保存人们上传的代码。他们可以上传多个代码文件,然后将其 key 保存在代码集合中。一切都只针对一个请求。第一次请求后,Code JDO 类无法持久保存。默默地,应用程序中的任何地方都没有任何异常,即使使用事务,它也认为交易已关闭并提交。

这就是我正在做的事情:

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
List<Key> uploadedCodeKeys = new ArrayList<Key>();
List<Code> uploadedCode = new ArrayList<Code>();
if(req.getParameterValues("code") == null) {
resp.sendRedirect("/");
}
for(int i = 0; i < req.getParameterValues("code").length; i++) {
String pastedCode;
String language;
String fileName;
try {
language = req.getParameterValues("language")[i];
pastedCode = req.getParameterValues("code")[i];
fileName = req.getParameterValues("filename")[i];
if(pastedCode == null || pastedCode.equals("")) {
pastedCode = "";
}
if(language == null) {
language = "Plain Text";
}
if(fileName == null) {
fileName = "Untitled";
}
} catch (Exception e) {
}
Code code = new Code(pastedCode, language);
code.setFileName(fileName);
uploadedCodeKeys.add(code.getKey());
uploadedCode.add(code);
}
PersistenceManager pm = GAEModel.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
long id = 0;
try {
tx.begin();
log.info("Attempting to save " + uploadedCode.size() + " files");
pm.makePersistentAll(uploadedCode);
tx.commit();
if(tx.isActive()) {
log.severe("Failed to save code files!");
tx.rollback();
pm.close();
return;
}
CodeCollection cc = new CodeCollection(uploadedCodeKeys);
pm.makePersistent(cc);
id = cc.getKey().getId();
} catch(Exception e) {
log.log(Level.SEVERE, "Failed to save files!", e);
} finally {
pm.close();
}

我正在为代码分配一个字符串散列或其他东西,它不是重复的。我已经尝试了几乎所有我能想到的最后几行的变体。代码集合每次都会与非持久代码文件的 ID 一起存储。

谢谢

这里还有在 DEBUG 级别失败的提交的日志:

ms=115 cpu_ms=168 api_cpu_ms=98 cpm_usd=0.004754我 2011-05-24 20:54:17.424com.mikehershey.paste.server.URLDispatcher doFilter:加载pageUpload我 2011-05-24 20:54:17.428org.datanucleus.ObjectManagerImpl close:未完成的非tx更新正在提交到数据存储我 2011-05-24 20:54:17.482org.datanucleus.ObjectManagerImpl close:未完成的非tx更新正在提交到数据存储

这是一个确实提交的日志(实例的第一个始终有效): http://pastebin.com/xW6xbfzK

如果我将两次提交都放入一个 tx 中,即使是第一次,代码也永远不会持久:

PersistenceManager pm = GAEModel.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
log.info("saving code file!");
pm.makePersistentAll(uploadedCode);
tx.commit();
} finally {
pm.close();
}
pm = GAEModel.get().getPersistenceManager();
tx = pm.currentTransaction();
try {
tx.begin();
CodeCollection cc = new CodeCollection(uploadedCodeKeys);
pm.makePersistent(cc);
id = cc.getKey().getId();
tx.commit();
} finally {
pm.close();
}

上面的代码从不保存 List(Code),但始终保存 CodeCOllection。当我注释掉事务时,CodeCollection 仍然始终保存,但是 List(code) 仅在对实例的第一个请求时保存。所有后续请求都无法持久化代码(沉默)

PersistenceManager pm = GAEModel.get().getPersistenceManager();
//Transaction tx = pm.currentTransaction();
try {
//tx.begin();
log.info("saving code file!");
pm.makePersistentAll(uploadedCode);
//tx.commit();
} finally {
pm.close();
}
pm = GAEModel.get().getPersistenceManager();
//tx = pm.currentTransaction();
try {
//tx.begin();
CodeCollection cc = new CodeCollection(uploadedCodeKeys);
pm.makePersistent(cc);
id = cc.getKey().getId();
//tx.commit();
} finally {
pm.close();
}

最佳答案

你的第一个持久化是在 txn 中,而你的第二个不是。第二个可能无法与 GAE/J 使用的 DataNucleus 版本(即古老版本)一起运行。将其放入 txn 中,或在其后运行 txn (tx.begin(); tx.commit();) 以刷新剩余的更新。

关于java - 谷歌应用程序引擎在第一次坚持后默默地坚持失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6118709/

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