如何在两个Java web服务之间共享内存?
我得到了两个Java web服务,托管在同一台服务器上的Tomcat中 有没有办法在他们之间共享内存(对象) 但是,我可以将共享转换为某种web方法调用如何在两个Java web服务之间共享内存?,java,web-services,tomcat,memory,share,Java,Web Services,Tomcat,Memory,Share,我得到了两个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可用于传输来自的所有更改