我有一个在Websphere Application Server(WAS)上运行的ear应用程序(myApp)。我有一个jar(myJar)在启动WAS服务器时加载到myApp的类路径中。 myJar有一个类(MyInitClass),它从数据库读取并将一组数据(myData)加载到内存中。 myApp会多次读取此数据。关键是要将myData放入内存以防止每次使用此数据时都进行数据库调用。这部分效果很好!
我试图提供的解决方案是MyInitClass的手动初始化。 myData会不时更改,我希望能够从命令行重新初始化MyInitClass,这样我就不必重新启动应用程序了。这可能吗?
myApp调用类似这样的类(MyClass):
public static MyInitClass initClass;
public boolean doStuff()
{
if (initClass == null)
{
// this method loads the data into initClass.myData array
initClass.dataInitializer();
}
else
// no need to reload initClass.myData
}
我在另一个类(MyManualInit)中创建了与此类似的代码:
public static void main(String[] args)
{
MyClass.initClass = new MyInitClass();
MyClass.initClass.dataInitializer();
}
当我从命令行运行MyManualInit时,它会打印从myApp初始化期间打印的所有相同调试信息。但myApp无法识别MyInitClass已重新初始化。我从两个进程中打印了System.out.println(System.getProperty(“java.home”))以验证我使用相同的JRE来运行它们。我在这里做了一些明显错误的事情,或者它是不是那样工作?我假设如果我在同一个JRE上运行MyManualInit它会起作用。 MyClass,MyInitClass和MyManualInit都在myJar中 如果您需要更多信息,请与我们联系。
答案 0 :(得分:1)
你在搅拌东西。 Websphere在JVM的一个实例中运行,并且您的命令行程序实例化一个新的JVM,并且对象不在不同的JVM之间进行通信(至少不需要付出一些努力,启用套接字等)。
实际上你的代码会对你的initClass对象做一个懒惰的初始化,而且没有任何命令行交互就足够了。为什么这对你来说还不够?