Utilisation de Terracotta pour les objets Java partagés (distribués)
Comment partagez-vous une instance / un objet entre différents processus Java?
EnvironmentConfig config = new EnvironmentConfig();
config.setLogLockTimeout(3000);
config.setManagementEnabled(false);
config.setEnvCloseForcedly(true);
Environment env = Environments.newInstance(dbPath, config);
environmentMap.put(dbPath, env);
Dans ce code ci-dessus, la Environmentclasse ne l'est pas Serializableet cet objet est utilisé dans le processus d'application avec:
Environment env = environmentMap.get(dbPath);
Puis utilisé comme:
EntityId[] id = null;
new PersistentEntityStoreBuilder(env).transact(txn -> {
id[0] = txn.createEntity(comparableMap);
});
return id[0];
Il Environments'agit de l'interface de la base de données intégrée qui est verrouillée dans le processus qui y a accédé pour la première fois. Ce qui signifie que les autres processus ne peuvent plus accéder à la base de données, donc pour que les autres processus puissent accéder à la base de données, il a besoin de la même instance du premier environnement. C'est là que les exigences d'objet Java «partagé» prennent racine.
Maintenant, je dois être capable d'utiliser ce même objet (l' environnement ) dans différents processus d'application, je comprends que ce n'est pas faisable nativement avec la JVM standard, comment Terracotta serait-il utile pour gérer une telle exigence, j'ai lu cela Terracotta, en fait, peut faire en sorte que plusieurs processus JVM agissent comme un seul, alors j'ai pensé que cela pourrait être la solution appropriée.
Le document déclare:
La mise en cluster au niveau JVM simplifie le Java d'entreprise en permettant aux applications d'être déployées sur plusieurs JVM, tout en interagissant les unes avec les autres comme si elles s'exécutaient sur la même JVM.
Si ce n'est pas possible avec Terracotta, pouvez-vous expliquer pourquoi? Si cela est possible, comment?
Réponses
En lisant un peu plus de ce document (ce que vous auriez pu faire vous-même), il semble que Terracotta est basé sur une instrumentation bytecode et peut en fait partager de manière transparente des graphiques d'objets entiers sur des machines virtuelles Java fonctionnant sur des machines séparées.
Donc, en principe, cela devrait fonctionner pour votre classe Environnement si la "base de données intégrée" derrière elle fonctionne entièrement en mémoire et ne fait rien de fou comme utiliser du code natif.
Que cela fonctionne dans la pratique et en particulier quel effet cela aura sur les performances est quelque chose que vous devrez simplement essayer.