You have specified <transaction-type>Bean</transaction-type>. Then I think you have to manually start and end the transaction. Do you do this? And I think you should use container for this option instead, and Required in the transaction-type of your methods.
Frank Morton wrote: >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