Aeg*_*gis 12 java struts2 glassfish shared-libraries java-ee
我们有一个用Java制作的Web应用程序,它使用struts2,spring和JasperReport.此应用程序在glassfish 4.0上运行.
应用程序的库位于WEB-INF/lib文件夹中,并且在glassfish中安装4个以上的库使用相同的库.
Glassfish配置为使用1024mb用于堆空间,512m用于permgen,当我使用每个应用程序的库时,大部分内存消耗在struts操作和spring aop类中(使用netbeans profiler).
我们遇到的问题是每个应用程序在类加载器中使用库所消耗的内存量,因为它很高并且会生成PermGen错误,我们也注意到应用程序运行速度越慢,用户越多.
因为我们尝试使用共享库,将它放在domain1/lib文件夹中,发现使用单个部署的应用程序,加载时间和内存消耗要低得多,并且应用程序通常工作得更快.但是当我们在服务器上部署其余的应用程序时,只有第一个加载的应用程序运行良好,其余的在我们调用struts2动作时出错.我们认为这是因为每个应用程序在struts2和log4j上的设置略有不同.
我们还尝试在glassfish上只放置某些库,并在应用程序中只留下struts2,但它显示了InvocationTargetException错误,因为所有库都依赖于来自apache-common的lib,如果我们将这些lib放在一个地方或另一个地方也没关系.此外,如果我们把它放在两个地方,应用程序不会启动.
使用共享库有什么特殊设置或最佳实践吗?有没有办法使用共享库但加载每个应用程序的设置?或者我们必须更改设置以使它们全部相同?
这些实际上是有趣的问题......我不使用 GlassFish,但是根据文档:
特定于应用程序的类加载
[...]您可以指定特定于模块或应用程序的库类[...]使用带有选项的asadmin部署命令
--libraries并指定逗号分隔的路径[...]规避类加载器隔离
由于每个应用程序或单独部署的模块类加载器域都是隔离的,因此应用程序或模块无法从另一个应用程序或模块加载类。这可以防止不同应用程序或模块中两个名称相似的类相互干扰。
要规避对多个应用程序访问的库、实用程序类或单独部署的模块的这一限制,您可以通过以下方式之一包含所需类的相关路径:
- 使用通用类加载器
- 跨集群共享库
- 将一个应用程序的客户端 JAR 打包到另一个应用程序中
使用通用类加载器
要使用通用类加载器,请将 JAR 文件复制到
domain-dir/lib或as-install/lib目录中,或将 .class 文件(以及其他所需文件,例如 .properties 文件)复制到该domain-dir/lib/classes目录中,然后重新启动服务器。使用公共类加载器使得部署在共享相同配置的服务器上的所有应用程序或模块都可以访问应用程序或模块。然而,这种可访问性并没有扩展到应用程序客户端。有关更多信息,请参阅将库与应用程序客户端一起使用。[...]
然后我会尝试:
domain1/lib,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
Run Code Online (Sandbox Code Playgroud)
隔离 Struts2 库类加载,同时将其余部分置于 Common Classloader 的控制之下。
domain1/lib,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
Run Code Online (Sandbox Code Playgroud)
通过实例化(模拟)不同版本的库来防止共享库。
希望有帮助,请告诉我上述一些方法是否有效。
| 归档时间: |
|
| 查看次数: |
4727 次 |
| 最近记录: |