繁体   English   中英

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

[英]How can I share memory between two Java web services?

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

有什么办法可以在它们之间共享内存(对象)?

我可以将共享变成某种Web方法调用

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

从来没听说过。 听起来好像充满了危险。 在一个应用程序中同步对象非常困难。 你两个没有希望。 这可能有什么好处?

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

有什么办法可以在它们之间共享内存(对象)?

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

但是您不能将Java对象放在该区域中。 JVM在Java代码或本机代码中均不支持此功能。 (即使可以,同步也将是一个大问题。)


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

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

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

尝试使用JCS:

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

希望能帮助到你! ;)

如何使用共享库。

您可以重构逻辑,将其移动到单独的库中,并作为单独的jar进行构建。

罐子应该放在tomcat_home / lib目录中。 并且在您的Web应用程序中,应按提供的库依赖关系设置 (在maven中)

您将创建和存储需要共享的对象存储在共享内存中,并可以从任何网站访问它们

在进程间通信中,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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM