我的应用是JDO+Spring+Jsp,我做了一个SessionListener,当session超时,就更新用户的一条记录,问题是这样的,如果我点退出正常退出时,是可以成功更新的,但是等到session超时自动调用时,就会出错,抛出JDOUSEEXCEPTION,pm is closed ,找了很久,不知道问题出在哪里,请各位赐教!万分感谢! 

解决方案 »

  1.   

    你用JDO访问数据的?
    应该是操作数据库时,persistence manager已经关闭了。
      

  2.   


    public class SsionListener implements HttpSessionListener {
        public void sessionCreated(HttpSessionEvent event) {
        }    public void sessionDestroyed(HttpSessionEvent event) {
          更新
         }
    }不行吗?
      

  3.   

    我是用JDO的,代码也是写在sessionDestroyed()方法中,如果是用户点击退出触发SsionListener ,sessionDestroyed()方法中的代码可以正常执行,就是等到session-timeout时不能正常执行,感觉很奇怪!代码是这样的:
    public class SessionListener extends HttpServlet implements HttpSessionListener { public void sessionCreated(HttpSessionEvent en) {
    System.out.println("----------------------created session--------------------");
    }
    public void sessionDestroyed(HttpSessionEvent en) {
    System.out.println("----------------------destroy session--------------------");
    HttpSession session=en.getSession();
            Integer id=(Integer)session.getAttribute("userId");
                            if(id!=null){
    int userId=id.intValue();
    ServletContext application = session.getServletContext();    
    WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext   (application);
    SpecialService service = (SpecialService)context.getBean("specialService");
    User tempUser =new User();
    User user=service.getUser(userId);
    service.getClone().clone(tempUser,user);
    String ip1=user.getIp1();
    String ip2=user.getIp2();
    String currentIP=(String)en.getSession().getAttribute("currentIp");
    if(currentIP.equals(ip1)){
    tempUser.setIp1("");
    service.updateUser(user,tempUser);
         session.removeAttribute("userId");
         session.removeAttribute("userId");
    session.invalidate();
    }
    else if(currentIP.equals(ip2)){
    tempUser.setIp2("");
    service.updateUser(user,tempUser);
         session.removeAttribute("userId");
         session.removeAttribute("userId");
    session.invalidate();
    }
    }
    }
    }
      

  4.   

    抛出的异常代码是这样的:请各位帮忙看一下:
    15:48:14,437 ERROR [/fashion]:709 - Session event listener threw exception
    javax.jdo.JDOUserException: The pm is closed
            at com.versant.core.common.BindingSupportImpl.invalidOperation(OpenAccess_3.2.18_:378)
            at com.versant.core.jdo.UnsynchronizedPMProxy.checkClosed(OpenAccess_3.2.18_:113)
            at com.versant.core.jdo.UnsynchronizedPMProxy.getRealPM(OpenAccess_3.2.18_:90)
            at com.versant.core.jdo.PCStateMan.getPm(OpenAccess_3.2.18_:162)
            at com.versant.core.jdo.PCStateMan.checkTxDSReadOnPNonTx(OpenAccess_3.2.18_:483)
            at com.versant.core.jdo.PCStateMan.isLoaded(OpenAccess_3.2.18_:430)
            at com.fashion.pop.model.User.jdoGetaccount(User.java)
            at com.fashion.pop.model.User.getAccount(User.java:107)
            at com.fashion.pop.service.impl.MyClone.userClone(MyClone.java:55)
            at com.fashion.pop.service.impl.MyClone.clone(MyClone.java:17)
            at com.fashion.pop.tool.SessionListener.sessionDestroyed(SessionListener.java:123)
            at org.apache.catalina.session.StandardSession.expire(StandardSession.java:697)
            at org.apache.catalina.session.StandardSession.isValid(StandardSession.java:581)
            at org.apache.catalina.session.ManagerBase.processExpires(ManagerBase.java:679)
            at org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:664)
            at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1285)
            at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(Conta
    inerBase.java:1570)
            at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(Conta
    inerBase.java:1579)
            at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(Conta
    inerBase.java:1579)
            at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.jav
    a:1559)
            at java.lang.Thread.run(Thread.java:619)
    pm.closed