2011-11-22 148 views
1

我有两个Java Web服务,托管在同一台服务器上的Tomcat中。如何在两个Java Web服务之间共享内存?

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

我可以把共享到某种网络方法的调用,但是

  1. 这是复杂的,需要很大的变化。
  2. 这是不是真的共享,对象是重复的,虽然它应该适用于我的情况。
  3. 这将公开不应该由客户端调用的方法。
+0

从来没听说过。听起来像是充满危险。在一个应用程序中同步对象已经很困难;两个人都没有希望。这可能有什么好处? – duffymo

+0

这两个Web服务在同一个Web应用程序中吗? –

+1

这个答案怎么样:http://stackoverflow.com/questions/268129/whats-the-best-way-to-share-business-object-instances-between-java-web-apps-usi – Sotomajor

回答

5

不,我知道的。听起来像是充满危险。在一个应用程序中同步对象已经很困难;两个人都没有希望。这可能有什么好处?

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

+0

谢谢。我们考虑过使用数据库,只是希望有更容易的事情。另外,这些对象不需要被持久化。使用另一种可以调用的服务是atm的最佳选择。 – David

+0

我不同意。我看不出数据库中的只读数据是如何困难的。在我看来,服务并不是最好的选择。 – duffymo

2

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

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

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


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

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

总之,这将是工作的实施显著量,它不会“感觉”之类的JVM中被共享的对象。使用现有数据库或分布式缓存解决方案会更容易。

+0

谢谢。我同意,这将是一项重要的工作,并且不会像JVM共享对象那样“感觉”。我需要找到更好的解决方案。 – David

0

在进程间通信,爪哇表示:

为了便于进程间的通信,大多数操作系统支持 进程间通信(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。

+0

但是,谢谢,这将会类似于使用另一个Web服务在它们之间传递数据。 – David

+0

我怎样才能把它连接在一起?在Java中有命名管道吗?我只能找到在线程之间使用管道的示例 – David

0

如何使用共享库。

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

这个jar应该放在tomcat_home/lib目录下。 而在你的网络应用程序库相关应设置为提供(Maven中)

您存储创建和存储您需要在共享内存共享的对象,并通过任何网络访问它们

相关问题