初用Google App Engine for Java (org.apache.jasper.JasperExceptio; org.datanucleun)

 

参考学习指南:http://code.google.com/intl/zh-CN/appengine/

使用jdo时遇到一个,如下代码:

private void listEmployees(HttpServletRequest req) {

PersistenceManager pm = PMF.get().getPersistenceManager();

String query = "select from " + Employee.class.getName() + " order by id ";

try {

List<Employee> list = (List<Employee>) pm.newQuery(query).execute();

list.size();

req.setAttribute("employees", list);

} finally {

pm.close();

}

}

 

添了红色的一句解决问题了。

本来没写红色的那句跳转到页面是就报

 

org.apache.jasper.JasperException: An exception occurred processing JSP page /index.jsp at line 40

37:   System.out.println("exc");

38: }

39:     }

40: if (employees == null || employees.size() == 0) {

41: %>

42: <tr>

43: <td colspan="5" style='text-align: right'>无数据</td>

Caused by: org.datanucleus.exceptions.NucleusUserException:Object Manager has been closed错误。哦,原来是pm.close();,我的确关了,关了的确是不好使用关之前的值,但我也把值读出来放在了req.setAttribute("employees", list);中了啊。先不管我了,我把pm.close();关了果然解决了问题。于是想到了pm.newQuery(query).execute();可能有点问题,这让我联想到了Hibernate的load和get方法的区别,他的值也许不是直接取出来的,是放在缓存里的,在pm.close();之前没使用就失效了,关了之后使用就报错了。所以我在关之前使用下了list.size();使用list.size()没有别的意思,仅仅是使用下为了从缓存中取出来,这样就可以在关了之后继续使用。这样问题解决了。

刚用的还没认真看,也许有别的方法直接取出来,还没看先写下了笔记。我现在有两种解决方法,一种是等会执行pm.close();但这样开支太大,所以用第二种使用下list,即把他从缓存中取出。

附件:

1做了个crud的小应用(访问地址:http://gzhuyangjun.appspot.com/

2学习资料

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值