| 

.NET C# Java Javascript Exception

5
Hallo zusammen,

vielleicht könnt Ihr mir ja nen Tipp geben. Ich habe eine alte Java Web Applikation bei einem Kunden in der alle SQL´s hardcoded sind, immer wieder die selben Codeteile kopiert eingefügt wurden usw. , Ihr kennt den Horror ja zu genüge.

Nun ist mir bei einem Teil im Unittesting aufgefallen das ich einen Speicherüberlauf produzieren kann weil zuviele Ergebnisse zurück geliefert werden bzw. die Bean wird komplett mit Unterbeans befüllt (insgesamt 83 Felder) - gebraucht werden nur eine Handvoll Felder (5) für die Liste in der Maske. Also wird 95 % der Speichers sinnlos befüllt, denn wenn der Antrag geöffnet wird, wird der Antrag nochmal abgefragt.
Also dringend verbesserungsbedarf an der Stelle.

Idee:
Ich erstelle ein verkleinertes Bean namens AntragSuchBean in der nur die 5 Eigenschaften Name, Vorname, Geburtsdatum, AntragID, Erstellungsdatum hat. In der Suchmethode werden auch nur diese 5 Eigenschaften per SQL ausgelesen.
Gesagt, getan. Ich kann die komplette Tabelle nun abfragen ohne das ich den Tomcat Server zum Abschmieren bringe (~300k Zeilen).

Das ist aber immernoch statisches SQL das im Code doppelten und unnützen Code ausführt.

Da ich später sowisso die Anwendung auf Hibernate stellen möchte und mich daher jetzt damit beschäftige, gleich mal meine Frage ob ich in Hibernate dann einfach eine Objektzuordnung auf mein verkleinertes Bean mache und aus der "großen" Tabelle automatisch nötigen Felder ausgelesen werden, ohne das ich speziellen SQL Code hinzufügen muss.

Allerdings darf ich nichts vom Code posten, da gibt es eine Klausel im Vertrag. Ich würde nur Pseudocode Posten wenn jemand ein Beispiel braucht.

Grüße
News:
01.08.2014
Lord_Pinhead 778 1 8
Ich denke nicht das die Beans da viel dran drehen können. Sie rufen ja lediglich den entsprechenden Java Code auf. Was spricht denn dagegen ein eigenes SQL Statement zu schreiben das eben nur die entsprenden Spalten auswählt?
Chase 01.08.2014
1 Antwort
0
Also nach etwas Recherche nach meinem Urlaub bin ich auf Folgende Lösung gekommen:

Das Suchergebnis wird nach wie vor mit einer kleinen Bean als Objekt umgesetzt. Das muss man in Hibernate nun ins Mapping eintragen.

Im Code wird einfach ein HQL Aufruf verwendet der die Tabellenspalten selektiert und man erzeugt daraus eine Liste. Hier mal ein bisschen Pseudocode:

String query = "select new SuchErgebnisBean(an.id, an.name, an.vorname) from Antrag as an";
List<SuchErgebnisBean> ergebnisse = session.createQuery(query).list();


Fertig, nun hat mein eine Liste mit den Ergebnisobjekten das vom Webservice oder in die Applikation zurück gegeben werden kann.

Den Select sollte man aber mit @NamedQuery auslagern, man will ja nicht die komplette Applikation deployen wenn man nur den Select anpassen muss.

Darum geht es hier ja auch, die Hardcoded Selects aus den Klassen verschwinden zu lassen, Objektorientiert zu arbeiten und sich das Leben zu erleichtern.
14.08.2014
Lord_Pinhead 778 1 8

Stelle deine Java-Frage jetzt!