sharing a resource among different servlets
假设我有一个特定的资源(例如一个使用文件系统的奇怪的数据库),并且我有一个Java类R来管理这个资源(它支持高级API并管理诸如使用S时必需的并发性的东西)。现在我有一个约束,如果R的一个实例管理S,那么R的任何其他实例都不能同时访问S。
现在,假设我有一个servlet v1需要通过r访问s,我想让很多用户同时使用v1,因为容器会给每个用户分配一个新的v1线程,所以我想让r是静态的,在in it()方法中初始化它,以便在线程之间共享。这样行吗?
案例二:现在我有了不同的servletv1,…,vm,每个都可以从许多用户访问。现在,我希望所有这些servlet都可以有一个对s的rw访问权。我必须通过r访问s,并且不能简单地为每个servlet使用r的一个实例,因为一次只有一个实例可以处理s。是否有任何方法在所有servlet的所有线程中共享r?
在我的例子中,ps.r是像neo4j这样的嵌入式数据库。
- 你说R管理所有并发性的东西,为什么不为所有请求使用R的一个实例呢?
- 是的,这是我的想法,但是如何在所有不同的servlet之间共享这些单个实例?
- 可以使用静态对象,也可以使用单例对象
您可以在r上有一个静态初始值设定项来创建r的唯一实例,并将其存储在某个静态字段中(通过静态getter访问)。
您还可以通过实现ServletContextListener来创建和初始化R的一个实例。Web应用程序启动时调用contextInitialized方法。
- 好的,我需要创建一个扩展servletContextListener的类,在这个类中,我初始化r并设置一个context属性myservletContext.setAttribute("r",r),然后我可以通过myContext.getAttribute("r")从任何servlet访问它,对吗?
- 如果我需要关闭r,我可以在contextDestroyed中放入类似myContext.getattribute("r").shutdown()的内容。
- 您需要创建一个实现接口servletContextListener的类。使用注释@web listener或更新web.xml()注册该类。您可以使用ContextDestroyed方法关闭R(然后我也会将其从上下文中删除-请参见RemoveAttribute方法)
- 非常感谢!