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

问题描述

如何在不同的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类不是Serializable 并在整个应用程序过程中使用以下对象:

Environment env = environmentMap.get(dbPath);

然后像这样使用

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

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

现在,我需要能够在不同的应用程序流程中使用同一对象(环境),我知道这不是标准JVM本身可以实现的,Terracotta如何处理有用这样的要求,我一直在阅读,Terracotta实际上可以使多个JVM进程充当一个,所以我认为这可能是合适的解决方案。

document指出:

JVM级群集通过启用以下功能简化了企业Java 要部署在多个JVM上的应用程序,但每个应用程序都可以交互 就像它们在同一JVM上运行一样。

如果兵马俑无法做到这一点,您能解释为什么吗?如果可能的话,怎么办?

解决方法

通过阅读更多的文档(您可以自己完成),看起来Terracotta是基于字节码检测的,实际上可以透明地在运行在不同机器上的JVM之间共享整个对象图。

所以原则上它应该为您工作环境类 如果它后面的“嵌入式数据库”在内存中完全运行,并且不会像使用本机那样疯狂代码。

它是否在实践中有效,特别是它将对性能产生什么影响,您只需尝试一下即可。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...