将 Terracotta 用于(分布式)共享 Java 对象

Using Terracotta for (distributed) shared Java Objects

如何在不同的 Java 进程之间共享实例/对象?

EnvironmentConfig config = new EnvironmentConfig();
config.setLogLockTimeout(3000);
config.setManagementEnabled(false);
config.setEnvCloseForcedly(true);
Environment env = Environments.newInstance(dbPath, config);
environmentMap.put(dbPath, env); 

上面这段代码,Environment class 不是 Serializable 并且此对象在整个应用程序过程中使用:

Environment env = environmentMap.get(dbPath);

然后像这样使用:

EntityId[] id = null; 
new PersistentEntityStoreBuilder(env).transact(txn -> {
    id[0] = txn.createEntity(comparableMap);
});
return id[0];

Environment 是嵌入式数据库的接口,该接口锁定在首次访问它的进程中。意思是说,其他进程无法再访问数据库,因此为了让其他进程访问数据库,它需要第一个环境的相同实例。这就是“共享”Java 对象要求的根源。

现在我需要能够跨不同的应用程序进程使用同一个对象(Environment),我知道这在标准 JVM 本身是不可行的,怎么会Terracotta 对处理这样的需求很有用,我一直在阅读 Terracotta,事实上,可以使多个 JVM 进程作为一个进程,所以我认为它可能是合适的解决方案。

document 状态:

JVM-level clustering simplifies enterprise Java by enabling applications to be deployed on multiple JVMs, yet interact with each other as if they were running on the same JVM.

如果 Terracotta 无法做到这一点,您能解释一下原因吗?如果可行,怎么做?

通过阅读该文档的更多内容(您本可以自己完成),Terracotta 似乎是基于字节码检测的,实际上可以透明地跨 JVM 运行 在单独的机器上共享整个对象图.

所以原则上它应该适合你环境class如果它背后的“嵌入式数据库”完全运行在内存中并且不会像使用本机代码那样做任何疯狂的事情。

它在实践中是否有效,尤其是它对性能的影响是你必须要尝试的。