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