Эффект включения вызова по ссылке

Я получаю сообщения

<Warning> <EJB> <BEA-010202> <Call-by-reference is not enabled for the EJB 'myEjb'.
The server will have better performance if it is enabled. To enable call-by-reference, set the enable-call-by-reference element to True in the weblogic-ejb-jar.xml deployment descriptor or corresponding annotation for this EJB.>

и

<Warning> <EJB> <BEA-012035> <The Remote interface method: 'public abstract java.util.Collection my.sessionfassade.ejb.myFassade.myMethod(java.lang.String,java.lang.String,java.util.Collection) throws my.Exception' in EJB 'myEjb' contains a parameter of type: 'java.util.Collection' which is not Serializable. Though the EJB 'myEjb' has call-by-reference set to false, this parameter is not Serializable and hence will be passed by reference. A parameter can be passed using call-by-value only if the parameter type is Serializable.>

Почему это не будет включено по умолчанию, поскольку удаленные вызовы все еще возможны и выполняются по значению, если для флага установлено значение True? Есть ли какой-либо отрицательный эффект при настройке на True?

Ответ 1

call-by-reference = true не соответствует спецификации EJB.

Целью удаленных EJB было обеспечить прозрачность местоположения. Другими словами, если целевой EJB находится в другой JVM, то, очевидно, данные должны каким-то образом копироваться в эту JVM, поэтому для согласованности также копируются вызовы EJB в одной JVM. Если бы вызовы EJB в одной JVM не были скопированы, то вызывающий/вызываемый не знал бы, нужно ли им, например, защищать копию ArrayList. При постоянном копировании эта неоднозначность удаляется, но ценой производительности.

Если вы можете полностью доверять всем клиентам и EJB в одной JVM, и при необходимости вы устанавливаете соглашение для копирования данных, тогда вы можете включить call-by-reference = true.