Không, điều đó không đúng. Nếu ORB thực hiện tối ưu hóa đối tượng cục bộ (đôi khi "đối tượng collocated"), thì nó sẽ không mở bất kỳ ổ cắm nào, nhưng nó sẽ thực hiện tuần tự hóa/deserialization, thường nhanh hơn so với việc sắp xếp. Các bản sao đối tượng bổ sung được thực hiện để tránh vi phạm mô hình lập trình.
Sơ đồ được tạo cho phép tối ưu hóa này. Dưới đây là một giao diện ví dụ:
public interface a extends Remote {
public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException;
}
Dưới đây là kết quả của rmic -iiop -keep 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);
}
}
}
Khi vẫn còn sơ khai được kết nối với một đối tượng địa phương, nó gọi ObjectImpl._servant_preinvoke để định vị một servant (một trình bao bọc EJB trong trường hợp của bạn) trong cùng một JVM. Sau đó, nó tạo một bản sao của các đối số đầu vào (mô phỏng marshalling), gọi phương thức và tạo một bản sao của đối tượng kết quả (một lần nữa mô phỏng marshalling).
Tôi không phải là chuyên gia về WebLogic. Điều đó nói rằng, tài liệu này ngụ ý rằng WebLogic thực hiện tối ưu hóa đối tượng được phân bổ:
http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328
Nguồn
2010-04-27 13:29:37