如何处理使用相同库的许多 Web 应用程序的共享库

2023-12-23

我们有一个用 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,并且如果我们将这些库放在一个地方或另一个地方并不重要。另外,如果我们将它放在两个地方,应用程序就不会启动。

  1. 使用共享库有什么特殊设置或最佳实践吗?
  2. 有没有办法使用共享库但加载每个应用程序的设置?或者我们必须更改设置以使它们全部相同?

使用共享库有什么特殊设置或最佳实践吗?有没有办法使用共享库但加载每个应用程序的设置?或者我们必须更改设置以使它们全部相同?

这些实际上是有趣的问题......我不使用 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(使用前将#替换为@)

如何处理使用相同库的许多 Web 应用程序的共享库 的相关文章

随机推荐

  • 为什么无法创建分区表

    我正在尝试创建带有分区的简单表 这是我的命令 CREATE TABLE measurement city id int not null logdate date not null peaktemp int unitsales int PA
  • Mongo DB 3.0.7(安装在 Amazon EC2 上)上的远程和本地身份验证失败

    我创建了一个管理员用户 gt db createUser user administrator pwd password roles role userAdminAnyDatabase db admin Successfully added
  • .Net FtpWebRequest 有时会失败

    我尝试使用 FtpWebRequest 列出文件详细信息 但经常失败并出现 WebException 并显示错误 530 用户未登录 有时使用相同的凭据可以正常工作 这怎么可能 代码摘录 reqFTP FtpWebRequest FtpWe
  • 在 Rust 中迭代切片的值而不是引用?

    当循环结构体切片时 我得到的值是一个引用 这很好 但是在某些情况下 必须编写很烦人var as var 在很多地方 有没有更好的方法来避免重新声明变量 fn my fn slice MyStruct for var in slice let
  • 如何定义“AT-POS”方法?

    我定义了AT POS类的方法并导出 操作员 当我使用 然而 在该类的实例上 编译器忽略了我定义的运算符 这是代码 unit module somelib class SomeClass is export method AT POS ind
  • 将 C cstyle 数组视为 std::array

    是否有任何安全且符合标准的方法可以将 C 样式数组视为 std array 而不将数据复制到新的 std array 中 这显然无法编译 但却是我想要的效果 我的实际使用更复杂 但这个简短的示例应该显示我想要做的事情 我想reinterpr
  • 是否可以从另一个进程释放泄漏的内存?

    我有一个简单的测试 C 程序 它泄漏了 4 个字节的内存 include
  • 比较 Java8 中的 Instant

    我有这个对象 public class MatchEvent implements Serializable private static final long serialVersionUID 1L Id GeneratedValue s
  • max-width:auto == max-width:100% 吗?

    Is max width auto equal to max width 100 如果不是 有什么区别 他们不平等 auto不是有效值max width 如果您正在寻找一个表示 该元素的宽度没有上限 的值 则该值是none 参见规格max
  • 空检查对象中的解构变量

    我有下面所示的解构代码end time财产来自this props auction object const auction auction end time this props 但这里的问题是 如果拍卖是空对象 则上述常量将是未定义的
  • Swift WKWebView:调用方法时找不到变量错误

    我正在尝试将 GPS 坐标传递给方法调用setIOSNativeAppLocation 我有下面的代码 但我收到此错误 A JavaScript exception occurred UserInfo WKJavaScriptExcepti
  • Typescript 中的对象平等[重复]

    这个问题在这里已经有答案了 我正在打字稿中的向量上创建一个库 我的第一次测试失败了 它与 TypeScript JavaScript 中的对象相等有关 但我找不到一种方法来使测试变得绿色 Typescript 的官方文档中没有提到对象相等性
  • 如何在高图表中超链接条形图

    我有一个 highcharts 可以根据数据库中的数据呈现数据 我使用的是 bar 类型 现在我希望当用户单击该栏时 它将重定向到特定页面或例如另一个网站 我已经用谷歌搜索但无法得到答案 这是我正在使用的代码 function var ch
  • 以编程方式删除 field_group

    我在 Drupal 7 中有一个名为 group imagecache 的 field group 我如何以编程方式删除它 我尝试阅读代码 似乎它使用了 ctools 但我宁愿不使用 ctools ctools 是 field group
  • 仅在 spock 中基于调用次数模拟方法的返回

    是否可以根据调用方法的第 n 次来模拟 spock 中方法的返回值 请注意 我不想指定传入的参数 因为它对于特定的测试用例并不重要 例如 对于第一次调用 它应该返回 x 对于第二次调用 它应该返回 y 对的 这是可能的 someObject
  • 云存储桶中的公共对象无法通过负载均衡器访问

    我为我的 Google Cloud Storage 存储桶设置了 CDN 我已经上传了一个公共对象 您可以通过此处的公共链接查看它 https storage googleapis com staging twinkle 4acfc app
  • PlayFramework 2 + Ebean - 原始 Sql 更新查询 - 对数据库没有影响

    我有一个 play Framework 2 0 4 应用程序想要修改数据库中的行 我需要将数据库中的 少数 消息更新为 已打开 状态 读取消息 我做了如下 String sql UPDATE message SET opened true
  • 为什么 Pandas 默认会迭代 DataFrame 列?

    尝试了解 Pandas 某些功能背后的设计原理 如果我有一个包含 3560 行和 18 列的 DataFrame 那么 len frame 是3560 但是 len a for a in frame is 18 也许对于来自 R 的人来说这
  • MySQL 事务难题

    我需要在单个原子事务中执行多次插入 例如 开始交易 插入 插入 commit 然而 当 MySQL 遇到错误时 它只会中止导致错误的特定语句 例如 如果第二个插入语句中有错误 提交仍然会发生 并且第一个插入语句将被记录 因此 当发生错误时
  • 如何处理使用相同库的许多 Web 应用程序的共享库

    我们有一个用 Java 制作的 Web 应用程序 它使用了 struts2 spring 和 JasperReport 该应用程序在 glassfish 4 0 上运行 应用程序的库位于 WEB INF lib 文件夹中 并且在 glass