Bugs item #840449, was opened at 2003-11-12 04:52
Message generated for change (Comment added) made by loubyansky
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=376685&aid=840449&group_id=22866

Category: JBossCMP
Group: v3.2
>Status: Closed
>Resolution: Rejected
Priority: 5
Submitted By: Adrian Price (adrianprice)
>Assigned to: Alexey Loubyansky (loubyansky)
Summary: Exceptions from CMR iterator of NotSupported RO bean

Initial Comment:
Read-Only entity beans are typically deployed with a 
transactional attribute of NotSupported, because there 
is no intention to update the entity, and one wishes to 
leverage the container's caching capabilities across 
multiple transactions.  One does not wish the RO entity 
to be enlisted in a transaction, because this would 
negative impact performance by dramatically increasing 
the size of the cache required to support a given TPS 
throughput.  The same applies when an RO entity has a 
1:n or m:n relationship with other RO beans.  

According to the EJB2.0 Specification 17.6.2.1:

If a client calls with a transaction context, the 
container suspends the association of the transaction 
context with the current thread before invoking the 
enterprise bean’s business method. The container
resumes the suspended association when the business 
method has completed. The suspended transaction
context of the client is not passed to the resource 
managers or other enterprise Bean objects that are
invoked from the business method.

If the business method invokes other enterprise beans, 
the Container passes no transaction context with
the invocation.

However, according to the EJB2.0 Specification 10.3.8:

• It is the responsibility of the Container to throw the 
java.lang.IllegalStateException if an attempt is made to 
use a java.util.Iterator for a container-managed 
collection in a transaction context other than that in 
which the iterator was obtained.

It would seem that JBoss interprets this provision too 
literally, and throws an IllegalStateException even when 
a CMR collection of RO entities is obtained from within 
this same 'transaction suspended' state.  __This 
behaviour completely defeats the purpose of RO 
entities__.

For example, if we have two RO entities A and B, both 
deployed as txn NotSupported, and A has a 1:n 
parent:child relationship with B, the following code 
currently will not work:

public abstract class A implements EntityBean {
    // ejb*() etc...

    // Multi-valued CMR field.
    public abstract Collection getBCmr();
    public abstract void setBCmr(Collection bs);

    public BVO[] getBVO() {
        Collection bs = getBCmr();
        BVO[] bvo = new BVO[bs.size()];
        int i = 0;
        // Next line throws IllegalStateException!!!
        for (Iterator j = bs.iterator(); j.hasNext(); i++) {
            B b = (B)j.next();
            bvo[i] = b.getVO();
        }
        return bvo;
    }
}

BTW, the above code works fine on WebLogic.

----------------------------------------------------------------------

>Comment By: Alexey Loubyansky (loubyansky)
Date: 2003-11-12 13:15

Message:
Logged In: YES 
user_id=543482

17.4.1 Transaction attributes
...For entity beans that use EJB 2.0 container-managed
persistence, only the Required,
RequiresNew, or Mandatory transaction attributes should be
used for the methods defined in the
bean’s component interface and all the direct and indirect
superinterfaces of the component interface,
excluding the getEJBHome, getEJBLocalHome, getHandle,
getPrimaryKey, and isIdentical
methods; and for the methods defined in the bean’s home
interface and all the direct and
indirect superinterfaces of the home interface, excluding
the getEJBMetaData and getHomeHandle
methods specific to the remote home interface. Containers
may optionally support the use of the
NotSupported, Supports, and Never transaction attributes for
the methods of entity beans with
container-managed persistence. However, entity beans with
container-managed persistence that use
these transaction attributes will not be portable.
Containers may optionally support the use of the
NotSupported, Supports, and Never
transaction attributes for the methods of entity beans with
container-managed persistence
because the use of these transaction modes may be needed to
make use of container-managed
persistence with non-transactional data stores. In general,
however, the Application Assembler
should avoid use of the NotSupported, Supports, and Never
transaction attributes for
the methods of entity beans with container-managed
persistence because it may lead to inconsistent
results or to the inconsistent and/or to the partial
updating of persistent state and relationships
in the event of concurrent use...

read-only (jboss.xml) entity beans are not associated with
transactions and are not invalidated and thrown out of the
cache when the tx commits. But CMR collections are tied to
the tx in which they were created. And when the tx commits,
the collection is invalidated. It is specification compliant
behaviour.

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=376685&aid=840449&group_id=22866


-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003,
16-19 November in Las Vegas. Learn firsthand the latest
developments in Apache, PHP, Perl, XML, Java, MySQL,
WebDAV, and more! http://www.apachecon.com/
_______________________________________________
JBoss-Development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to