我们有一个用 Java 制作的 Web 应用程序,它使用了 struts2、spring 和 JasperReport。该应用程序在 glassfish 4.0 上运行。
应用程序的库位于 WEB-INF/lib 文件夹中,并且在 glassfish 中安装的库比使用相同库的库多了 4 个。
Glassfish 配置为使用 1024mb 作为堆空间,使用 512m 作为 permgen,当我使用每个应用程序的库时,大部分内存消耗都在 struts actions 和 spring aop 类中(使用 netbeans profiler)。
我们遇到的问题是每个应用程序的类加载器中包含库所消耗的内存量,因为内存量太高并会生成 PermGen 错误,而且我们还注意到,用户越多,应用程序运行速度就越慢。
因此,我们尝试使用共享库,将其放在 domain1/lib 文件夹中,发现使用单个部署的应用程序,加载时间和内存消耗要低得多,并且应用程序通常运行得更快。但是,当我们在服务器上部署其余应用程序时,只有第一个加载的应用程序运行良好,而当我们调用 struts2 操作时,其余应用程序会出现错误。
我们认为这是因为每个应用程序在 struts2 和 log4j 上的设置略有不同。
我们还尝试仅将某些库放在 glassfish 上,并在应用程序中仅保留 struts2,但它显示 InvocableTargetException 错误,因为所有库都依赖于 apache-common 中的 lib,并且如果我们将这些库放在一个地方或另一个地方并不重要。另外,如果我们将它放在两个地方,应用程序就不会启动。
- 使用共享库有什么特殊设置或最佳实践吗?
- 有没有办法使用共享库但加载每个应用程序的设置?或者我们必须更改设置以使它们全部相同?
使用共享库有什么特殊设置或最佳实践吗?有没有办法使用共享库但加载每个应用程序的设置?或者我们必须更改设置以使它们全部相同?
这些实际上是有趣的问题......我不使用 GlassFish,但是,根据文档 http://docs.oracle.com/cd/E18930_01/html/821-2418/gatej.html#scrolltoc :
特定于应用程序的类加载
[...]
您可以指定特定于模块或应用程序的库类 [...] 使用带有--libraries
选项并指定逗号分隔的路径
[...]
规避类加载器隔离
由于每个应用程序或单独部署的模块类加载器域都是隔离的,因此应用程序或模块无法从另一个应用程序或模块加载类。这可以防止不同应用程序或模块中两个名称相似的类相互干扰。
要规避对多个应用程序访问的库、实用程序类或单独部署的模块的这一限制,您可以通过以下方式之一包含所需类的相关路径:
- 使用通用类加载器
- 跨集群共享库
- 将一个应用程序的客户端 JAR 打包到另一个应用程序中
使用通用类加载器
要使用通用类加载器,请将 JAR 文件复制到domain-dir/lib
or as-install/lib
目录或将 .class 文件(以及其他所需文件,例如 .properties 文件)复制到domain-dir/lib/classes
目录,然后重新启动服务器。
使用公共类加载器使得部署在共享相同配置的服务器上的所有应用程序或模块都可以访问应用程序或模块。然而,这种可访问性并没有扩展到应用程序客户端。有关更多信息,请参阅将库与应用程序客户端一起使用。 [...]
然后我会尝试:
解决方案1
- 将除 Struts2 jar 之外的所有库放在下面
domain1/lib
,
- 只把Struts2 jar放在下面
domain1/lib/applibs
,
然后运行
$ asadmin deploy --libraries struts2-core-2.3.15.2.jar FooApp1.war
$ asadmin deploy --libraries struts2-core-2.3.15.2.jar FooApp2.war
隔离 Struts2 库类加载,同时将其余部分置于 Common Classloader 的控制之下。
解决方案2
- 将除 Struts2 jar 之外的所有库放在下面
domain1/lib
,
- 只把Struts2 jar放在下面
domain1/lib/applibs
,在具有不同名称的不同副本中,例如在 jar 名称处附加 _appname
然后运行
$ asadmin deploy --libraries struts2-core-2.3.15.2_FooApp1.jar FooApp1.war
$ asadmin deploy --libraries struts2-core-2.3.15.2_FooApp2.jar FooApp2.war
通过实例化(模拟)不同版本的库来防止共享库。
希望有帮助,请告诉我上述一些方法是否有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)