2010-01-03 4 views
3

Les appels EJB distants, effectués à partir du même serveur d'applications, sont-ils toujours optimisés en tant qu'appels locaux en mémoire et la sérialisation des données est-elle ignorée dans ce scénario? En d'autres termes, est-il valable de travailler avec des EJB distants tout le temps, réalisant ainsi un découplage entre les composants de l'application, même si deux modules + EJB sont déployés dans le même conteneur? J'utilise Glassfish. De plus, si je dois faire une recherche à l'exécution des EJB distants (je ne connais pas le nom JNDI d'EJB jusqu'à l'exécution), quelle est la meilleure façon de mettre en cache les appels, en utilisant le moins possible les frais généraux sur l'EJB? infrastructure EJB existante fournie par le serveur de l'application (donc, pas de bibliothèques supplémentaires comme Guice, juste ce que Glassfish offre déjà).Appel EJB3 distant

+0

Les interfaces EJB locales sont uniquement disponibles dans la même * application * - pas le même * serveur d'applications *. – Nate

+0

Juste, exactement. Donc, si vous souhaitez découpler des parties de votre application, même si les modules sont co-localisés dans le même AS, vous devez toujours utiliser des EJB distants, je ne vois pas d'autre moyen. – bozo

Répondre

3

La sémantique d'argument des services distants est différente de celle des services locaux. Les services distants, en raison de leur comportement de sérialisation, ont effectivement une sémantique pass-by-value (c'est-à-dire que les arguments sont copiés), alors que les services locaux sont standard java pass-by-reference. C'est plus qu'un simple examen des performances, cela change la signification de ce qu'est un paramètre. Pour cette raison, je ne pense pas qu'un conteneur puisse optimiser un appel à une interface EJB distante comme s'il s'agissait d'un appel local, en raison de cette différence sémantique.

+0

Eh bien, je ne vois pas pourquoi le conteneur ne pouvait pas optimiser l'appel "local" à l'interface EJB à distance, en fait je pense que je l'ai lu quelque part dans la documentation de Glassfish. Il ne faut pas beaucoup de cerveaux dans le conteneur pour le comprendre, passer la partie de sérialisation et passer à la place par référence. Cela semble très naturel. Problème: J'ai un système JEE extrêmement découplé, qui instancie les EJB nécessaires à l'exécution (en lisant leur description depuis la base de données), et il doit toujours être très rapide. Vous pouvez donc ajouter EJB à l'exécution et le moteur d'exécution de l'application l'exécutera si nécessaire. – bozo

+0

Parce que lorsque vous écrivez une interface distante, vous l'écrivez en espérant une sémantique de valeur par défaut. Le conteneur ne peut pas changer de sémantique dans l'intérêt de la performance, il en changerait la * signification *. – skaffman

+0

En fait, il semble que vous puissiez dire au conteneur de passer par référence, même si vous utilisez des interfaces distantes dans des modules EJB co-localisés. – bozo