Wichtige Frage zu EJB

Diamantregen

Grünschnabel
Hallo,

waer toll wenn Ihr mir helfen koenntet.

Und zwar have ich eine Tabelle die heisst "Documents". In dieser Tabelle sind nun neben varchar2 und number Spalten auch folgende blob spalten vorhanden: document1, document2 und document3.

Ich habe nun folgende finder methode fuer diese Tabelle:

Code:
<query>
            <query-method>
               <method-name>findByCustomerId</method-name>
               <method-params>
                  <method-param>java.lang.Integer</method-param>
                  <method-param>java.util.Date</method-param>
               </method-params>
            </query-method>
            <ejb-ql><![CDATA[select object(t) from Documents as t where t.customer.id=?1 AND t.updated > ?2 order by t.updated desc]]></ejb-ql>
         </query>

Bis hierhin so weit so gut.

Dann habe ich ein Session Bean welches eben jene Methode fuer den Klienten zur Verfuegung stellt:

Code:
public ArrayList getDocumentsByCustomerId(Integer customerid, int days)
			throws EJBException {
		try {
			InitialContext context = new InitialContext();

			//Get the home interface with JNDI from the application server
			DocumentsLocalHome documentsLocalHome = (DocumentsLocalHome) context.lookup(DocumentsLocalHome.JNDI_NAME);
			Calendar now = Calendar.getInstance();
			now.add(Calendar.DAY_OF_MONTH, -days++);
			//get all Documents with the local home interface
			
			Collection collection = documentsLocalHome.findByCustomerId(customerid, now.getTime());
			
			//define an ArrayList
			ArrayList arrayList = new ArrayList();
			//loop over the collection
			for (Iterator iter = collection.iterator(); iter.hasNext();) {
				DocumentsLocal element = (DocumentsLocal) iter.next();

				//define a new DocumentsView object
				DocumentsView documentsView = new DocumentsView();
				//set the DocumentsValue in documentsView
				documentsView.setdocumentsValue(element
						.getDocumentsValue());
				
				//add the documentsView object to the ArrayList
				arrayList.add(documentsView);
			}
			//return the array of DocumentsView
			return arrayList;

		} catch (NamingException e) {
			throw new EJBException(e.getMessage());
		} catch (FinderException e) {
			throw new EJBException(e.getMessage());
		}
	}

Bemerkung: DocumentView ist lediglich ein Wrapper fuer ein DocumentValue

Meine Frage ist nun: Wird bei Aufruf der Methode des Session Beans jedes DocumentsView mit realen Daten gefuellt? Ich nehme mal stark an ja, denn die das Ausfuehren der Methode dauert sehr lang obwohl nur 3 Zeilen in der Tabelle vorhanden sind und ich daher die 3 blob Spalten Document1, Document2 und Documents3 als Ursache vermute.

Wie kann erreicht werden dass zunaechst nur Referenzen bestehen (wie es ja eigentlich der Fall sein sollte) und nur bei explizitem Aufruf die blob Daten aus der Datenbank geholt werden? Wie muesste dieser Aufruf dann aussehen?

Ich hatte mir zuerst ueberlegt nur die Spalten ohne die blobs in die finder methode zu schreiben und dann mit einer zusaetzlichen finder methoden pro blob dann die blobs explizit zu holen. Dies scheitert allerdings daran dass ich nirgends eine Moeglichkeit gefunden habe nur gewisse Spalten per finder zu holen und es mit Sicherheit eine andere Loesung fuer das oben beschriebene Problem geben muss.

Ich hoffe ein paar von Euch koennen mir einen Ratschlag geben, wenn moeglich mit Beispiel, danke :)

Beste Gruesse,
Roger
 
Hallo!

Wie wär's denn wenn du mal in der Doku deines AppServers nachschaust ob man bei der verwendeten CMP Engine sowas wie Lazy Loading auf CMP-Field Ebene aktivieren kann.

Gruß Tom
 
Hallo Tom,

vielen Dank fuer Deine Antwort. Hat mich schon einen guten Schritt voran gebracht!

Ich verwende Jboss als Applikationsserver und hier gibt es ja durchaus die Option des lazy loadings. Doch abgesehen davon dass ich noch nicht gefunden habe wie load-groups und eager-load-groups per Xdoclet definiert werden, ist noch folgende Frage offen: Wann genau werden die load-group Felder mit Daten gefuellt? Wenn schon das alleinige Iterieren durch die Collection (siehe meine Code oben) das Befuellen bewirkt, wuerde es ja nicht viel bringen...ein Befuellen durch den Aufruf einer getter-Methode schon.

Waer supie wenn Du eventuell noch ein paar Tips hast, vielleicht auch mit Beispielcode? Danke :)

Beste Gruesse,
Roger
 

Neue Beiträge

Zurück