在我对Servlet的理解中,Servlet将由容器实例化,其init()
方法将被调用一次,并且直到JVM关闭之前,Servlet将像单例一样存在。
我不希望我的Servlet被序列化,因为当应用程序服务器恢复或正常启动时,它将被新构造。Servlet不应该持有任何特定于会话的成员,因此将其写入磁盘并重新实例化是没有意义的。 这有什么实际用途吗?
我的担忧是,我在其中放置了一些不可序列化的字段,然后我的应用程序将在生产环境中出现神秘故障,其中将发生不同类型的会话复制。
在我对Servlet的理解中,Servlet将由容器实例化,其init()
方法将被调用一次,并且直到JVM关闭之前,Servlet将像单例一样存在。
我不希望我的Servlet被序列化,因为当应用程序服务器恢复或正常启动时,它将被新构造。Servlet不应该持有任何特定于会话的成员,因此将其写入磁盘并重新实例化是没有意义的。 这有什么实际用途吗?
我的担忧是,我在其中放置了一些不可序列化的字段,然后我的应用程序将在生产环境中出现神秘故障,其中将发生不同类型的会话复制。
从技术上讲,我认为servlet容器可以像EJB会话bean一样将servlet对象写入磁盘进行"休眠"。因此,如果您的应用程序中存在非可序列化字段,您是正确的,需要问这个问题,以确定是否会导致应用程序失败。
实际上,在我的实践经验中,我从未听说过容器这样做,因此这只是早期J2EE时代的遗留问题。我不会担心它。
<distributable />
来触发。 - Archimedes TrajanoHttpServlet 应该被序列化到磁盘并在 servlet 容器重新启动后继续存在。例如,Tomcat 允许您设置标志以启用此类继续存在。下一个选项是使用 JNDI 进行传输。这不是垃圾,它仅在极端情况下使用。
谷歌似乎暗示这样做是为了让容器作者有选择的权利,如果他们想要的话。
你说得对,Servlet 不应该持有任何特定于会话的成员,事实上我认为你希望尽可能少地保留状态。如果你把所有东西都存储在 Session 或 ServletConfig 中,我认为你可以在序列化时生存下来。
就像Session对象被序列化以在支持集群选项的servlet容器中生存缓存一样,可能会有一个选项让容器将Servlet实例传输到另一个集群节点??我只是猜测
Serializable被用作分布式环境中会话属性的标记接口。
SRV.7.7.2 分布式环境(JSR-154)