如何在两个Java Web服务之间共享内存?
我有两个Java Web服务,托管在同一台服务器上的Tomcat中。如何在两个Java Web服务之间共享内存?
有什么办法在它们之间共享内存(对象)?
我可以把共享到某种网络方法的调用,但是
- 这是复杂的,需要很大的变化。
- 这是不是真的共享,对象是重复的,虽然它应该适用于我的情况。
- 这将公开不应该由客户端调用的方法。
有什么办法在它们之间共享内存(对象)?
您可以创建由两个JVM共享的共享内存区域。您可以使用本机代码或(理论上)将文件映射到两个应用程序的地址空间中执行此操作。
但是你不能把Java对象放在那个区域。 JVM不支持Java代码或本地代码。 (即使你能,同步将是一个很大的问题。)
所以可以您使用共享内存在两个JVM之间共享数据?
也许吧。但是,您需要将共享内存段视为一种数据库,并实现用于在段与每个JVM堆之间复制对象状态的方案。你需要实现一个强大的同步方案,可能使用信号量。
总之,这将是工作的实施显著量,它不会“感觉”之类的JVM中被共享的对象。使用现有数据库或分布式缓存解决方案会更容易。
谢谢。我同意,这将是一项重要的工作,并且不会像JVM共享对象那样“感觉”。我需要找到更好的解决方案。 – David
在进程间通信,爪哇表示:
为了便于进程间的通信,大多数操作系统支持 进程间通信(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...
}
更新的对象“一个”可以做下面的方式
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。
这很有趣。但它不涉及在不同JVM之间共享内存。或者至少,这是我对文档的阅读。 –
如何使用共享库。
您可以重构您的逻辑,将它们移动到单独的库中,然后构建为单独的jar。
这个jar应该放在tomcat_home/lib目录下。 而在你的网络应用程序库相关应设置为提供(Maven中)
您存储创建和存储您需要在共享内存共享的对象,并通过任何网络访问它们
从来没听说过。听起来像是充满危险。在一个应用程序中同步对象已经很困难;两个人都没有希望。这可能有什么好处? – duffymo
这两个Web服务在同一个Web应用程序中吗? –
这个答案怎么样:http://*.com/questions/268129/whats-the-best-way-to-share-business-object-instances-between-java-web-apps-usi – Sotomajor