我的应用是JDO+Spring+Jsp,我做了一个SessionListener,当session超时,就更新用户的一条记录,问题是这样的,如果我点退出正常退出时,是可以成功更新的,但是等到session超时自动调用时,就会出错,抛出JDOUSEEXCEPTION,pm is closed ,找了很久,不知道问题出在哪里,请各位赐教!万分感谢!
public class SsionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent event) { } public void sessionDestroyed(HttpSessionEvent event) { 更新 } }不行吗?
我是用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(); } } } }
抛出的异常代码是这样的:请各位帮忙看一下: 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
应该是操作数据库时,persistence manager已经关闭了。
public class SsionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
} public void sessionDestroyed(HttpSessionEvent event) {
更新
}
}不行吗?
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();
}
}
}
}
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