Vaadin 7 UI 会话过早关闭
Vaadin 7 UI session gets closed prematurely
在我当前的基于 Vaadin 7.6.2
的项目中,我收到一个错误,我根本没有在我的代码中找到解释。在此应用程序中,我为 UI 会话打开了一堆 EntityManagers,然后在会话分离时关闭它们(当调用 UI.detatch()
时)。现在我的问题是我的日志清楚地表明会话已分离然后再次使用。据我所知,这不应该发生,对吗?
以下是日志文件的摘录:
*** || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.db.EntityManagerBeanFactory.closeAll()
|| Closed 3 entity managers for session a******.i****
*** || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.BagheeraUI.detach()
|| Session de.darkblue.bagheera.BagheeraUI@1c5c5ab2 was detatched.
[...]
!!!! || 29.02.2016 10:00:21:159 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | com.vaadin.server.DefaultErrorHandler.doDefault()
|| caused by:
|| java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManager.
|| at org.eclipse.persistence.internal.jpa.EntityManagerImpl.verifyOpenWithSetRollbackOnly(EntityManagerImpl.java:1934)
|| at org.eclipse.persistence.internal.jpa.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:2569)
|| at de.darkblue.bagheera.ui.tab.EditActivityReportTab.isOverlappingEntry(EditActivityReportTab.java:383)
|| [...]
您可以看到会话 BEC3759B529AC42AA7FFE62314633979
在 09:59:32:504
关闭,但在将近一分钟后重新使用。我的印象是,当 UI.detatch()
被调用时(如日志第 2 行),UI 实例不再被使用,因为会话已过期(由于三个任务心跳)?我觉得我对 Vaadin UI 会话的生命周期有错误的想法。如果有人可以帮助我阐明这个主题,那就太好了。
我不确定您正在打印和指的是哪个会话。
我想你知道这一点,但你有 HttpSession
持有一个 VaadinSession
对象,该对象持有多个 UI
对象。如果其中任何一个听起来很有趣,我想你会发现这很有帮助 - how to put data in session variable and get the data in different page in vaadin?.
但是,我的感觉是您需要重新考虑您的 EntityManager
生命周期 - 请参阅 https://vaadin.com/docs/-/part/framework/jpacontainer/jpacontainer-hibernate.html
尽管如此,其他人确实提倡 EM-per-session 方法,如此处所示 - Save changes to database vaadin。
综上所述,同一个VaadinSession
绝对可以用于多个UI,事实上你会在VaadinSession
中看到一个名为uIs
的地图。现在,您似乎确实为每个浏览器 window 获得了一个新的 VaadinSession
,但是从同一个 window 实例化多个 UI
对象并不难,它们将共享同VaadinSession
。
最后值得注意的是,大多数正常设置在浏览器实例中的所有 windows 中也只有一个 HttpSession
。
在我当前的基于 Vaadin 7.6.2
的项目中,我收到一个错误,我根本没有在我的代码中找到解释。在此应用程序中,我为 UI 会话打开了一堆 EntityManagers,然后在会话分离时关闭它们(当调用 UI.detatch()
时)。现在我的问题是我的日志清楚地表明会话已分离然后再次使用。据我所知,这不应该发生,对吗?
以下是日志文件的摘录:
*** || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.db.EntityManagerBeanFactory.closeAll()
|| Closed 3 entity managers for session a******.i****
*** || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.BagheeraUI.detach()
|| Session de.darkblue.bagheera.BagheeraUI@1c5c5ab2 was detatched.
[...]
!!!! || 29.02.2016 10:00:21:159 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | com.vaadin.server.DefaultErrorHandler.doDefault()
|| caused by:
|| java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManager.
|| at org.eclipse.persistence.internal.jpa.EntityManagerImpl.verifyOpenWithSetRollbackOnly(EntityManagerImpl.java:1934)
|| at org.eclipse.persistence.internal.jpa.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:2569)
|| at de.darkblue.bagheera.ui.tab.EditActivityReportTab.isOverlappingEntry(EditActivityReportTab.java:383)
|| [...]
您可以看到会话 BEC3759B529AC42AA7FFE62314633979
在 09:59:32:504
关闭,但在将近一分钟后重新使用。我的印象是,当 UI.detatch()
被调用时(如日志第 2 行),UI 实例不再被使用,因为会话已过期(由于三个任务心跳)?我觉得我对 Vaadin UI 会话的生命周期有错误的想法。如果有人可以帮助我阐明这个主题,那就太好了。
我不确定您正在打印和指的是哪个会话。
我想你知道这一点,但你有 HttpSession
持有一个 VaadinSession
对象,该对象持有多个 UI
对象。如果其中任何一个听起来很有趣,我想你会发现这很有帮助 - how to put data in session variable and get the data in different page in vaadin?.
但是,我的感觉是您需要重新考虑您的 EntityManager
生命周期 - 请参阅 https://vaadin.com/docs/-/part/framework/jpacontainer/jpacontainer-hibernate.html
尽管如此,其他人确实提倡 EM-per-session 方法,如此处所示 - Save changes to database vaadin。
综上所述,同一个VaadinSession
绝对可以用于多个UI,事实上你会在VaadinSession
中看到一个名为uIs
的地图。现在,您似乎确实为每个浏览器 window 获得了一个新的 VaadinSession
,但是从同一个 window 实例化多个 UI
对象并不难,它们将共享同VaadinSession
。
最后值得注意的是,大多数正常设置在浏览器实例中的所有 windows 中也只有一个 HttpSession
。