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

如何在两个Java web服务之间共享内存?,java,web-services,tomcat,memory,share,Java,Web Services,Tomcat,Memory,Share,我得到了两个Java web服务,托管在同一台服务器上的Tomcat中 有没有办法在他们之间共享内存(对象) 但是,我可以将共享转换为某种web方法调用 这很复杂,需要做很多修改 这不是真正的共享,对象是重复的,尽管它应该适用于我的情况 这将公开客户端不应调用的方法 据我所知没有。听起来很危险。在一个应用程序中同步对象已经够难的了;你对两个人没有希望。这有什么好处呢 如果这是您需要的常用方法,请将它们放入一个双方都可以调用的服务中。如果是公共数据,请将其放入数据库。据我所知,不是这样。听起来很危

我得到了两个Java web服务,托管在同一台服务器上的Tomcat中

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

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

  • 这很复杂,需要做很多修改
  • 这不是真正的共享,对象是重复的,尽管它应该适用于我的情况
  • 这将公开客户端不应调用的方法

  • 据我所知没有。听起来很危险。在一个应用程序中同步对象已经够难的了;你对两个人没有希望。这有什么好处呢


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

    据我所知,不是这样。听起来很危险。在一个应用程序中同步对象已经够难的了;你对两个人没有希望。这有什么好处呢

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

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

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

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


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

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

    简言之,要实现它需要大量的工作,而且不会“感觉”JVM在共享对象。使用现有的数据库或分布式缓存解决方案会更容易

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

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

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


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

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


    简言之,要实现它需要大量的工作,而且不会“感觉”JVM在共享对象。使用现有数据库或分布式缓存解决方案会更容易。

    关于进程间通信,Java说:

    为了促进进程之间的通信,大多数操作系统 支持进程间通信(IPC)资源,如管道和 套接字。IPC不仅仅用于网络上进程之间的通信 相同的系统,但不同系统上的进程

    我宁愿选择管道或插座。这将使您的生活更加轻松,您的web服务更加灵活,因为它们可以在两台独立的机器上运行,并且仍然能够像并排设置一样相互通信

    这是说,回到实践。例如,假设您有一组对象
    {a,b,c}
    ,希望在您的服务之间共享。创建一个包含
    {a,b,c}
    对象的数据存储类,每当有更新时,在数据存储
    dataStore.setA(新的\u a)
    中进行更新。在幕后,对于每次更新,本地数据存储将通知位于另一个应用程序中的远程数据存储,并传输刚刚进行的所有更新。以下DTO可用于将所有更改从一个数据存储传输到另一个数据存储:

    public class ObjectUpdateEvent<Source> implements Serializable {
        private String fieldName;
        private Object previousValue;
        private Object newValue;
        private Source source;
        // Constructor...
    }
    
    公共类ObjectUpdateEvent实现可序列化{
    私有字符串字段名;
    私有对象优先值;
    私有客体价值;
    私人来源;
    //构造器。。。
    }
    
    更新对象“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;
        }
    }
    
    公共类数据存储{
    // .....
    公共setA(一个新的_A){
    ObjectUpdateEvent updateDto=新的ObjectUpdateEvent();
    更新到.setPreviousValue(a);
    更新到.setNewValue(新值);
    sendUpdateDto();
    a=新的_a;
    }
    }
    

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

    关于进程间通信,Java说:

    为了促进进程之间的通信,大多数操作系统 支持进程间通信(IPC)资源,如管道和 套接字。IPC不仅仅用于网络上进程之间的通信 相同的系统,但不同系统上的进程

    我宁愿选择管道或插座。这将使您的生活更加轻松,您的web服务更加灵活,因为它们可以在两台独立的机器上运行,并且仍然能够像并排设置一样相互通信

    这是说,回到实践。例如,假设您有一组对象
    {a,b,c}
    ,希望在您的服务之间共享。创建一个包含
    {a,b,c}
    对象的数据存储类,每当有更新时,在数据存储
    dataStore.setA(新的\u a)
    中进行更新。在幕后,对于每次更新,本地数据存储将通知位于另一个应用程序中的远程数据存储,并传输刚刚进行的所有更新。以下DTO可用于传输来自的所有更改