Nie, to nieprawda. Jeśli ORB zaimplementuje optymalizację lokalnego obiektu (czasami "obiekty kolokowane"), to nie otworzy żadnych gniazd, ale wykona serializację/deserializację, co jest zwykle szybsze niż zestawienie. Dodatkowe kopie obiektów są tworzone w celu uniknięcia naruszenia modelu programowania.
Wygenerowane stuby umożliwiają tę optymalizację. Oto przykład interfejs:
public interface a extends Remote {
public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException;
}
tutaj jest wynikiem rmic -iiop -Trzymaj a:
public ArrayList test(ArrayList arg0, ArrayList arg1) throws java.rmi.RemoteException {
if (!Util.isLocal(this)) {
/* ... trim remote code ... */
} else {
ServantObject so = _servant_preinvoke("test",a.class);
if (so == null) {
return test(arg0, arg1);
}
try {
Object[] copies = Util.copyObjects(new Object[]{arg0,arg1},_orb());
ArrayList arg0Copy = (ArrayList) copies[0];
ArrayList arg1Copy = (ArrayList) copies[1];
ArrayList result = ((a)so.servant).test(arg0Copy, arg1Copy);
return (ArrayList)Util.copyObject(result,_orb());
} catch (Throwable ex) {
Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
throw Util.wrapException(exCopy);
} finally {
_servant_postinvoke(so);
}
}
}
Kiedy stub jest podłączony do lokalnej obiektu, wywołuje ObjectImpl._servant_preinvoke do zlokalizowania sługa (opakowanie EJB w twoim przypadku) w obrębie tej samej maszyny JVM. Następnie tworzy kopię argumentów wejściowych (symulowanie zestawiania), wywołuje metodę i tworzy kopię obiektu wynikowego (ponownie symulując zestawienie).
Nie jestem ekspertem od WebLogic. To powiedziawszy, ten dokument implikuje, że WebLogic wykonuje optymalizację obiektów kolokowanych:
http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328