Tomcat重新加载后保留不可序列化对象的值

时间:2017-01-27 21:54:37

标签: java jsp servlets

我的课程必须经过一个学习步骤,大约需要15分钟才能完成。这种学习的结果是存储在两个公共对象中的两个模型,然后将在其他类中使用。我把这个学习步骤放在以下方法中:

public void init()

以便在服务器启动时执行。问题是,每次服务器重新加载时,它都会重新执行学习步骤。我必须再等15分钟才能看到一个小变化的影响。我想知道是否有办法在整个程序和服务器的运行过程中保留一些对象的值。这是我的代码:

public static Model model1;
public static Model model2;

@Override
public void init()
{
    model1= readModel(source1)
    model2= readModel(source2)
}

PS。我正在使用带有JSP页面和Tomcat服务器的Servlet。

3 个答案:

答案 0 :(得分:-1)

作为一般解决方案,我建议您将学习部分和模型保留在服务容器之外。可能是不同的VM /进程。这样,只要需要运行该进程,您就可以保留模型,而与您的tomcat客户端进程的状态无关。

<强>详细

您可以通过几个步骤实现这一目标

  • 首先,您需要将模型准备和缓存迁移到其他程序。该程序将作为守护程序运行,您可以使用Apache的Daemon将其作为后台服务运行
  • 其次,假设您的守护程序已启动并正在运行,您的模型使用者可以使用标准协议与模型VM进行通信。协议的选择取决于您的确切要求。它可以是通过TCP / HTTP或RMI或其他任何方式公开的API。

<强>替代地

正如我在评论中建议的那样,一旦模型被训练,您也可以将模型二进制文件转储到文件系统。在tomcat启动时缓存模型。 io将比学习阶段快得多。

答案 1 :(得分:-1)

根据需要将其设置为会话或应用程序范围的bean,并将其作为bean而不是普通对象访问。

答案 2 :(得分:-1)

你可以看看here? 想法是在某个地方保存会话并将模型对象放在那里或者只使用Hazelcast(可能是过度杀戮:))