-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Batch processing mit großen Datenmengen
PostPosted: Sat Aug 05, 2006 7:02 am 
Newbie

Joined: Wed Aug 02, 2006 5:53 pm
Posts: 4
Hallo,

ich habe eine Frage. Zwar habe ich sie schon im englischen User-Forum gestellt, aber bis jetzt keine Antwort erhalten. Vielleicht kann mir jemand hier helfen.

Ich benutze hibernate 3.2

Beispiel:

Ich möchte eine Kopie von Tabelle 1 ("InterfaceTable") in die Tabelle 2 ("BaseTable") durchführen.

Für die beiden Tabellen habe ich die Geschäftsklassen definiert (mit Hibernate Tools in Eclipse, InterfaceObj und BaseObj)

BaseObj enthält Plausibilitätsmethoden, mit welchen die Attribute auf die Korrektheit geprüft werden.

Der Kopiervorgang läuft folgendermaßen ab:
Code:
//open Session
conf = new Configuration().configure();
factory = conf.buildSessionFactory();
session = factory.openSession();

//read InterfaceData
Criteria criteriaObjectsInInterface = session.createCriteria(InterfaceObj.class);
dataObjectsInInterface  = criteriaObjectsInInterface.list();   

//read BaseData
Criteria criteriaObjectsInBasis = session.createCriteria(BaseObj.class);
dataObjectsInBasis  = criteriaObjectsInInterface.list();


int nSizeBasisTable = dataObjectInBasis.size();
       
int nSize = dataObjectsInInterface.size();

//transfer data
Iterator iteratorDPInt = dataObjectInBasis.iterator();
trans = session.beginTransaction();
while(iteratorDPInt.hasNext())
{     
            dpInt = (InterfaceObj) iteratorDPInt.next();
           
            if(nSizeBasisTable > 1) //here possible updates
            {
                if(locateInBasisData())//locate BaseObj with primary keys from dpInt , update if a BaseObj was found
                {
                    dataObjectBasis.setValuesFromInterface(dpInt );
                }
            }
            else//here inserts
            {
                dataObjectBasis =new BaseObj() ;
                dataObjectBasis.setValuesFromInterface(dpInt);
            }
           
          //Validate Data
         try
         {
            dataObjectBasis.validate();           
        }
        catch(Exception e)
        {
          //do something with validating failures
        }

}


//and now commitChanges
trans.commit();
session.close();

//end

Im Abschnitt //read BasisData werden alle Daten aus der "BaseTable" geholt, damit die Methode locateInBasisData schnell den entsprechenden Basisobjekt finden kann (andernfalls wird für jeden Objekt aus der "InterfaceTable" eine Select-Afrage an die Datenbank geschickt, und das geht in die Zeit...)

Mit solch definierter Procedur kann ich problemlos 30 000 datensätzen (in beiden Tabellen) unter 10 sek. verarbeiten, ohne dass mir der Speicher ausläuft.

Aber:

Im Extremdfall können viel mehr Datensätze vorhanden sein. 500 000, 1 000 000 und mehr

Natürlich möchte ich meine oben definierte Procedur, sowohl mit kleinen Datenmengen als auch mit sehr großen, benutzen. Damit aber der Arbeitspeicher in Falle von großen Datenmengen nicht ausläuft, brauche ich die Möglichkeit die Daten zu "cachen" in die lokal auf dem Rechner (auf dem das Programm läuft) befindeten Dateien.
Ist sowas möglich mit Hibernate? Ich meine, ist es möglich beim Hibernate irgendwas zu setzen (vielleicht irgend ein Property), sodass sein DataStore zum Teil in die Dateien auslagert wird, un Hibernate damit arbeitet?

Ich habe die Ratschläge in Docu (siehe Kapitel 13 "Batch processing") gelesen, aber was da beschrieben wird, ist für mich keine Lösung, weil wenn ich die daten "päckchenweise" verarbeite, dann ist die Wahrscheinlichkeit hoch, dass die Methode locateInBasisData für jeden Objekt aus dem "Interface"-Packchen einen Select an die Datenbank absetzen wird, und nicht local gesucht wird.
Auch kann bei der "Päckchenweise"-Arbeitsweise der Speicher auslaufen, somit ist es in meinen Augen keine wirkliche Lösung.
Auch die Verarbeitungszeit wird damit ungemein verlängert.

Ich hoffe, meine Frage ist klar, wenn aber nicht, bitte Bescheid geben.

Danke im Voraus an Alle,

Nikolai

P.S. ich benutze SE-Umgebung, kein App. oder Web Server


Top
 Profile  
 
 Post subject:
PostPosted: Sun Aug 06, 2006 11:44 am 
Newbie

Joined: Wed Aug 02, 2006 5:53 pm
Posts: 4
also, irgendeine Meldung wäre schon mal nett...


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.