GWT RequestFactory:如何对每个请求使用单个EntityManager
为了将GWT RequestFactory:如何对每个请求使用单个EntityManager,gwt,code-injection,cdi,entitymanager,requestfactory,Gwt,Code Injection,Cdi,Entitymanager,Requestfactory,为了将RequestFactory发送到,我需要确保对每个请求使用相同的EntityManager 我根据ThreadLocal实现拼凑了自己的工厂类,但我不确定如何正确释放资源(例如,如何知道请求已完成并调用close()) 有没有一种简单的方法可以确保在给定的ServletRequest中使用单个EntityManager,而不必求助于J2EE/CDI上的完整版本?如果必须的话,我会选择这条路线,但我希望保持简单,特别是因为我想继续使用GWT附带的轻量级开发服务器。DynaTableRf示例
RequestFactory
发送到,我需要确保对每个请求使用相同的EntityManager
我根据ThreadLocal
实现拼凑了自己的工厂类,但我不确定如何正确释放资源(例如,如何知道请求已完成并调用close()
)
有没有一种简单的方法可以确保在给定的ServletRequest中使用单个EntityManager,而不必求助于J2EE/CDI上的完整版本?如果必须的话,我会选择这条路线,但我希望保持简单,特别是因为我想继续使用GWT附带的轻量级开发服务器。DynaTableRf示例应用程序通过添加servlet过滤器在其文件中设置持久性上下文来做类似的事情。或者,当
super.doPost()
返回时,您可以将其子类化并重写其doPost()
方法,以在finally
块中拆下EntityManager
。以下是我根据和的反馈最终得出的结论
为EntityManager创建线程本地保持器;当实体需要获取EntityManager时,请在实体中引用此选项:
public class ThreadLocalEntityManager
{
private static ThreadLocal<EntityManager> holder = new ThreadLocal<EntityManager>();
private ThreadLocalEntityManager()
{
}
public static EntityManager get()
{
return holder.get();
}
public static void set(EntityManager em)
{
holder.set(em);
}
}
然后将筛选器应用于/gwtRequest URL模式:
<filter>
<filter-name>PersistenceFilter</filter-name>
<filter-class>com.example.PersistenceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PersistenceFilter</filter-name>
<url-pattern>/gwtRequest</url-pattern>
</filter-mapping>
持久性过滤器
com.example.PersistenceFilter
持久性过滤器
/gwtRequest
请注意,这里有一个缺陷-无论底层代码是否使用该servlet,都会为通过该servlet的每个请求创建EntityManager。它可能会变得更加健壮,并且只有在请求时才以某种方式懒洋洋地创建EntityManager(和事务)
但到目前为止,这段代码似乎与RequestFactory
配合得很好。欢迎提出改进建议
注意:这段经历告诉我,完全使用CDI可能值得一试,而不是尝试实现像这样的部分。在这个项目中,我只是没有时间进行这样的移动 如果使用Spring,只需将OpenEntityManagerView servlet过滤器添加到web.xml中即可
<filter>
<filter-name>entityManagerFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>entityManagerFilter</filter-name>
<url-pattern>/gwtRequest</url-pattern>
</filter-mapping>
实体管理过滤器
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
实体管理过滤器
/gwtRequest
再次感谢您,BobV。我正在尝试servlet过滤器方法。每个请求使用一个EntityManager,这当然解决了我的RequestFactory问题。但现在我正在泄漏资源。它总是有意义的。:-)一旦我解决了bug,我会回来总结。我怀疑你会有很多不需要EntityManager的请求通过这个过滤器。这正是我所做的,对我来说也很好!在appengine上,事务位不起作用,但在JDO中打开和关闭持久性管理器也很有效。
<filter>
<filter-name>entityManagerFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>entityManagerFilter</filter-name>
<url-pattern>/gwtRequest</url-pattern>
</filter-mapping>