Maybe I should try a different tactic..... Does anyone have an entity bean that has a method that returns a Collection that performs well with ~200 elements in the Collection? Reaching it through a session bean is fine. If so, would you share the source? I'm beginning to believe that no one actually has done this successfully.
Still working on this without success. I have tried all suggestions, including wrapping it with a UserTransaction, but still didn't make any difference. Still wanting cmp to work.............. > I think I'm close.Thanks to all who have given advice. If I get > this going, I'll be glad to write up the results, which based on > dain's comments, others are also asking about. Here are the > details (using 3.0.0.RC1): > > I have two cmp entity beans: Container and Attribute. > > I also have a stateless session bean called ContainerControl. In this > class, there is a method called findByPrimaryKeyMap. This method > does a findByPrimaryKey on a Container. It also does a > findByContainerId, which returns a Collection of ~ 200 elements > on Attribute, causing the performance problem. The findByPrimaryKeyMap > method returns what I call a ContainerMap, which encapsulates > the two find results as well as build a lookup table of the Collection. > > I have a web application that does the following: > > ContainerControl containerControl = Factory.getContainerControl(); > ContainerMap containerMap = containerControl.findByPrimaryKeyMap(id,"name"); > CollectionMap attributeMap = containerMap.getAttributeMap(); > > Basically looks up the session bean, does the find and gets the results > out of the ContainerMap. When the ContainerMap is built, it iterates > the Collection, taking over 100 ms per element. Based on that, each > step must still think it is a transaction. > > Based on the ejb-jar below, I think the session bean ought to be a single > transaction, but it isn't. The ContainerControl ejb-jar.xml files looks > like: > > > <?xml version="1.0" encoding="UTF-8"?> > > <ejb-jar> > <description>Container Session Beans</description> > <display-name>Container Session Beans</display-name> > <enterprise-beans> > <session> > <ejb-name>ContainerControl</ejb-name> > > <home>com.base2inc.bean.session.container.ContainerControlHome</home> > > <remote>com.base2inc.bean.session.container.ContainerControl</remote> > > <ejb-class>com.base2inc.bean.session.container.ContainerControlBean</ejb-cla > ss> > <session-type>Stateless</session-type> > <transaction-type>Bean</transaction-type> > </session> > <session> > <ejb-name>ContainerValue</ejb-name> > <home>com.base2inc.bean.session.container.ContainerValueHome</home> > <remote>com.base2inc.bean.session.container.ContainerValue</remote> > > <ejb-class>com.base2inc.bean.session.container.ContainerValueBean</ejb-class > > > <session-type>Stateless</session-type> > <transaction-type>Bean</transaction-type> > </session> > </enterprise-beans> > > <assembly-descriptor> > <container-transaction> > <method> > <ejb-name>ContainerControl</ejb-name> > <method-name>*</method-name> > </method> > <trans-attribute>Required</trans-attribute> > </container-transaction> > </assembly-descriptor> > </ejb-jar> > > Any idea will be tried. Thanks. > > > > You must use a transaction for your unseen session bean that is accessing > > the entity beans. Otherwise, as Dain says, everytime you change a bean in > > the collection, it creates a transaction, reads ahead 1000 or so > (depending > > upon read-ahead limit) then when you edit the bean, it commits the > > transaction, which loses all the read-ahead information. Then as you edit > > the next bean, it starts the whole process over again. > > > > If your session bean was called AttributeManager, you would use a > > container-transaction like the following in the assembly-descriptor > element. > > This way, the transactions on the Attribute bean are encompassed by the > > transaction on the session bean method that is iterating over the > > collection. > > > > <container-transaction> > > <method> > > <ejb-name>AttributeManager</ejb-name> > > <method-name>*</method-name> > > </method> > > <trans-attribute>Required</trans-attribute> > > </container-transaction> > > > > Michael > > > > > -----Original Message----- > > > From: Frank Morton [mailto:[EMAIL PROTECTED]] > > > Sent: Tuesday, April 23, 2002 11:50 AM > > > To: [EMAIL PROTECTED] > > > Subject: Re: [JBoss-user] CMP: Iterate Collection Performance Killer > > > > > > > > > > Use a transaction or turn off read ahead. You are basically reading > > > > ahead data, tossing the read-ahead information out, and > > > then repeating. > > > > > > > > -dain > > > > > > Thanks for your response. > > > > > > Sorry for my confusion, but I am. Your doc states to use <read-ahead> > > > with the <strategy>on-load</strategy> for this exact case, but doesn't > > > seem to make a difference at this point. You are saying strategy=none > > > is the right thing to do? I tried that, too, which doesn't > > > appear to make > > > any difference. Please clarify this. There is a lot of contradictory > > > info on the web about this. I also tried setting <read-ahead> in > > > standardjaws.xml to true and false, neither of which seemed to > > > make any difference. Seems no matter what I do, I get the > > > same behavior, so I must be missing something. > > > > > > While I'm irritating you, can you explain exactly how or refer me to > > > someplace that explains exactly how to use a transaction to speed up > > > reading Collections. > > > > > > Thanks. I'm guessing I'm not the only one that needs to know > > > about this. > > > > > > Frank > > > > > > Here is my ejb-jar.xml file in case it is of use to you: > > > > > > <?xml version="1.0" encoding="UTF-8"?> > > > > > > <ejb-jar> > > > <description>Attribute Management</description> > > > <display-name>Attribute Management</display-name> > > > > > > <enterprise-beans> > > > <entity> > > > <description>Attribute</description> > > > <ejb-name>Attribute</ejb-name> > > > > > > <local-home>com.base2inc.bean.entity.attribute.AttributeHome</ > > local-home> > > > > > > <local>com.base2inc.bean.entity.attribute.Attribute</local> > > > > > > <ejb-class>com.base2inc.bean.entity.attribute.AttributeBean</e > > > jb-class> > > > <persistence-type>Container</persistence-type> > > > <prim-key-class>java.lang.Long</prim-key-class> > > > <reentrant>False</reentrant> > > > <cmp-version>2.x</cmp-version> > > > > > > <cmp-field><field-name>id</field-name><jdbc-type>BIGINT</jdbc- > > > type></cmp-fie > > > ld> > > > > > > <cmp-field><field-name>containerId</field-name><jdbc-type>BIGI > > > NT</jdbc-type> > > > </cmp-field> > > > > > > <cmp-field><field-name>containerType</field-name></cmp-field> > > > <cmp-field><field-name>name</field-name></cmp-field> > > > <cmp-field><field-name>value</field-name></cmp-field> > > > <primkey-field>id</primkey-field> > > > <read-ahead> > > > <strategy>on-load</strategy> > > > <limit>255</limit> > > > <cache-size>1000</cache-size> > > > </read-ahead> > > > </entity> > > > </enterprise-beans> > > > > > > <assembly-descriptor> > > > <container-transaction> > > > <method> > > > <ejb-name>Attribute</ejb-name> > > > <method-name>*</method-name> > > > </method> > > > <trans-attribute>Required</trans-attribute> > > > </container-transaction> > > > </assembly-descriptor> > > > > > > </ejb-jar> > > > > > > Frank Morton wrote: > > > > > > > > > Using 3.0.0RC1 with PostgreSQL underneath. Just converted > > > > > to using a Local Interface, but didn't make as much performance > > > > > difference as I hoped. > > > > > > > > > > I have a case where I need to iterate a Collection resulting from > > > > > a finder method with an entity bean. Since the collection > > > might have > > > > > 200 items, performance is very bad iterating the Collection. > > > > > (I do have an index on the field used for finding). > > > > > > > > > > Using a Collection in the first place is what I would like to do > > > > > since some of the elements require an update. But, since I > > > > > know I will be looking at each item in the Collection, is there > > > > > some way to fetch the content of the collection as a group > > > > > prior to iterating instead of getting killed by the performance > > > > > of fetching one at a time? > > > > > > > > > _______________________________________________ > JBoss-user mailing list > [EMAIL PROTECTED] > https://lists.sourceforge.net/lists/listinfo/jboss-user > _______________________________________________ JBoss-user mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-user