如何在两个Java Web服务之间共享内存?

时间:2011-11-22 10:18:26

标签: java web-services tomcat memory share

我有两个Java Web服务,在同一台服务器上托管在Tomcat中。

有没有办法在它们之间共享内存(对象)?

我可以将共享转换为某种Web方法调用,但是

  1. 这很复杂,需要做很多改动。
  2. 这不是真正的共享,对象是重复的,虽然它应该适用于我的情况。
  3. 这将公开客户端不应调用的方法。

5 个答案:

答案 0 :(得分:5)

不是我知道的。听起来像是充满了危险。在一个应用程序中同步对象很困难;你对两个人没有希望。这有什么用呢?

如果这是您需要的常用方法,请将它们放入可以调用的服务中。如果是常见数据,请将其放入数据库中。

答案 1 :(得分:2)

  

有没有办法在它们之间共享内存(对象)?

您可以创建由两个JVM共享的共享内存区域。您可以使用本机代码执行此操作,或者(理论上)将文件映射到两个应用程序的地址空间。

但是你不能把Java对象放在那个区域。 JVM不支持Java代码或本机代码。 (即使你可以,同步也是一个大问题。)


所以可以使用共享内存在两个JVM之间共享数据吗?

也许。但是您需要将共享内存段视为一种数据库,并实现一种在段和每个JVM堆之间复制对象状态的方案。而且您需要实现一个强大的同步方案,可能使用信号量。

简而言之,实现它将是一项重要的工作,并且它不会“感觉”像JVM共享对象一样。使用现有数据库或分布式缓存解决方案会更容易。

答案 2 :(得分:1)

尝试使用JCS:

http://commons.apache.org/proper/commons-jcs/

希望它有所帮助! ;)

答案 3 :(得分:0)

关于进程间通信,Java说:

  

促进流程,大多数操作系统之间的通信   支持进程间通信(IPC)资源,例如管道和   插座即可。 IPC不仅用于进程之间的通信   相同的系统,但不同系统的过程。

我宁愿去找管道或插座。这将使您的生活变得更轻松,您的Web服务更加灵活,因为它们可以在两台独立的机器上运行,但仍然可以相互交谈,就像它们并排​​设置一样。

据说这是回到实践中。比如说,您有一组要在服务之间共享的对象{a,b,c}。创建一个包含{a,b,c}个对象的数据存储类,每当有更新时,在数据存储dataStore.setA(A new_a)中执行此操作。在场景后面,对于每次更新,本地数据存储将通知位于其他应用程序中的远程数据存储,并传输刚刚进行的所有更新。以下DTO可用于将所有更改从一个数据存储传输到另一个数据存储:

public class ObjectUpdateEvent<Source> implements Serializable {
    private String fieldName;
    private Object previousValue;
    private Object newValue;
    private Source source;
    // Constructor...
}

更新对象“a”可以通过以下方式完成

public class DataStore{
    // .....

    public setA(A new_a){
      ObjectUpdateEvent<DataStore> updateDto = new ObjectUpdateEvent<DataStore>();
      updateDto.setPreviousValue(a);
      updateDto.setNewValue(new_a);
      sendUpdateDto();
      a = new_a;
    }
}

编辑:这正是@duffymo上面提到的。

答案 4 :(得分:0)

如何使用共享库。

您可以重构逻辑,将它们移动到单独的库中,并构建为单独的jar。

jar应放在tomcat_home / lib 目录中。 在您的网络应用中,库依赖关系应设置为提供(在maven中)

您存储创建并存储您需要在共享内存中共享的对象,并从任何Web访问它们