【发布时间】:2011-05-25 01:48:28
【问题描述】:
我有一个 servlet 可以保存人们上传的代码。他们可以上传多个代码文件,然后将其密钥保存在代码集合中。一切都适用于一个请求。在第一次请求之后,Code JDO 类静默地无法持久化。就像在应用程序中的任何地方都没有任何异常一样,即使使用它认为 tx 已关闭并提交的事务也是如此。
这是我正在做的事情:
@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();
}
我正在为代码分配一个字符串哈希或其他东西,它不是重复的。我已经尝试了几乎所有我能想到的最后几行的变化。 codecollection 每次都与非持久代码文件的 id 一起存储。
谢谢
这里还有来自在 DEBUG 级别失败的提交的日志:
ms=115 cpu_ms=168 api_cpu_ms=98 cpm_usd=0.004754 我 2011-05-24 20:54:17.424 com.mikehershey.paste.server.URLDispatcher doFilter:加载页面上传 我 2011-05-24 20:54:17.428 org.datanucleus.ObjectManagerImpl 关闭:未完成的 nontx 更新被提交到数据存储 我 2011-05-24 20:54:17.482 org.datanucleus.ObjectManagerImpl 关闭:未完成的 nontx 更新正在提交到数据存储区
这是一个确实提交的日志(实例的第一个始终有效): 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();
}
【问题讨论】:
-
这就是为什么你有一个日志 ;-) 在 DEBUG 级别
-
否定。继承自 apppot.com 的所有日志(添加到帖子)他们不适合这里。
标签: java google-app-engine web-applications jdo