我需要在同一台机器上运行的两个Java应用程序(两个不同的JVM)之间共享数据。我确切地说要共享的数据很大(大约7 GB)。应用程序必须非常快速地访问数据,因为它们必须以非常高的速率应答传入的查询。我不希望应用程序为每个应用程序保存一份数据副本。
我已经看到一个选项是使用内存映射文件。应用程序A从某处获取数据(比如数据库)并将其存储在文件中。然后,应用程序B可以使用java.nio
访问这些文件。我不确切知道内存映射文件是如何工作的,我只知道数据存储在一个文件中,并且该文件(或其中的一部分)被映射到内存区域(虚拟内存?)。因此,这两个应用程序可以读写内存中的数据,并且更改会自动(我猜?)提交到文件中。我也不知道文件的最大大小是否完全映射到内存中。
我的第一个问题是两个应用程序在这种情况下共享数据的不同可能性(我的意思是考虑到数据量非常大,并且访问这些数据必须非常快)?我确切地说这个问题与内存映射I / O无关,只是知道解决同样问题的其他方法是什么。
我的第二个问题是使用内存映射文件的优缺点是什么?
由于
答案 0 :(得分:9)
我的第一个问题是两个应用程序共享数据的不同可能性是什么?
正如S.Lott指出的那样,机制中有批次:
AF_UNIX
还是AF_INET
还是AF_INET6
我的第二个问题是使用内存映射文件的优缺点是什么?
优点:
缺点:
答案 1 :(得分:1)
内存映射文件听起来很头疼。一个简单的选项,不易出错,可以使用具有群集感知缓存的共享数据库。这样只会写入数据库,并且可以从缓存中提供读取。
作为如何在休眠中执行此操作的示例,请参阅http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-cache