G
Guest
Gast
Hallo,
Erhoffe mir ein paar Tipps zu folgendem Problem:
Habe ein mittelgroßes Projekt (knapp 20k Zeilen Code) das ich aus verschiedenen Gründen derzeit gründlich überarbeite inklusive Refactoring. Gespeichert wird in einer MySQL-Datenbank (Zugriff über JDBC).
Es gibt nur 5 oder 6 Klassen deren Daten in die Datenbank gespeichert werden (je 1-4 Querys, die Klassen kümmern sich derzeit selbst um das speichern), aber aus performance (aber auch funktionalen) Gründen werden auch im restlichen Programm immer mehr SQL-Querys verwendet.
Derzeit werden noch keinen Transaktionen benutzt was zu kleineren Dateninkonsistenzen führen könnte.
Ich verwende eine selbst geschriebene Datenbank-Klasse welche SQL-Anfragen ausführt (sprich sich darum kümmert das eine Datenbankverbindung besteht, ggf. auch zusätzlich eine SSH-Verbindung zum Server, dann das Statement an die Datenbank absetzt) Das Vorgehen ist bsiher sehr beschränkt, man ruft im wesentlichen entweder "executeUpdate(String query)" oder "getPreparedStatement()" mit anschließendem "executePreparedStatement(PreparedStatement statement)" auf.
Was mir nicht gefällt:
a) SQL-Code überall im Projekt
b) Keine Transaktionen möglich da die Datenbank-Klasse nicht weiß welche Transaktionen zusammengehören
c) Die Datenbank-Klasse muss ich jeder Klasse per Konstruktor mitgeben oder als Parameter bei nur von extern aufgerufenen Methoden, aufgrund der Hierachie muss ich desshalb teilweise Daten die Datenbank-Klasse mitgeben die sie selbst gar nicht brauchen sondern nur weitergeben
d) Meine 5-6 Datenklassen sind zu mächtig, die sollen abgespeckt werden da sie mittlerweile weitaus mehr Code zum speichern und laden sowie sonstige Zwecke enthalten (z.B. getPrintedLabel() welches ein Label mit allen Druckdaten zurükliefert, recieveParcelStatus() welches die Paketdaten aus dem internet abruft usw.) als eigentliche Daten. Ich denke darüber nach diese zu reinen Datenklassen zu machen, aber wohin lagert man die bisherigen Methoden aus?
e) Zuverlässigkeit und Logging: Da die Abhängigkeit vom Programm immer größer wird und mehr und mehr kritische Bereiche hinzukommen bei denen Fehler ernste Konsequenzen haben muss die zuverlässigkeit möglichst hoch sein und ein Logging eingeführt werden damit Fehler schneller behoben werden können und die Daten eventuell korrigiert werden können. Logging könnte z.B. mit log4j erfolgen, aber da habe ich ja dasselbe Problem wie bei den SQL-Querys=> überall im ganzen Programm verteilt!
Bisher ist die Zuverlässigkeit deutlich zu kurz gekommen, das muss sich ändern
Bin noch Student (Diplom Informatik) und habe schon viel während der Programmierung dieses Projektes gelernt, aber immer nur Try&Error ist doof :wink: daher würde ich mich über ein paar Tipps freuen.
Über Hibernate hab ich schon einiges gelesen und mich informiert, was mir aber nicht ganz klar ist ob dies auch für die überall verteilten SQL-Abfragen (welche nichts mit laden oder speichern von daten zur Objektertsellung zu tun haben) einen sinnvollen Ansatz darstellen kann. Solch eine Abfrage enthält z.B. die Anweisung alle Rechnungsnummern zu liefern die Artikel x enthalten oder alle Rechnungen von einem Kunden mit dem Namen xy oder den zur Rechnung gehörigen Auftrag bzw. umgekehrt oder alle Paketnummern die zu einem Auftrag gedruckt wurden usw.
Wie gesagt, würde mich über ein paar Tipps freuen!
Erhoffe mir ein paar Tipps zu folgendem Problem:
Habe ein mittelgroßes Projekt (knapp 20k Zeilen Code) das ich aus verschiedenen Gründen derzeit gründlich überarbeite inklusive Refactoring. Gespeichert wird in einer MySQL-Datenbank (Zugriff über JDBC).
Es gibt nur 5 oder 6 Klassen deren Daten in die Datenbank gespeichert werden (je 1-4 Querys, die Klassen kümmern sich derzeit selbst um das speichern), aber aus performance (aber auch funktionalen) Gründen werden auch im restlichen Programm immer mehr SQL-Querys verwendet.
Derzeit werden noch keinen Transaktionen benutzt was zu kleineren Dateninkonsistenzen führen könnte.
Ich verwende eine selbst geschriebene Datenbank-Klasse welche SQL-Anfragen ausführt (sprich sich darum kümmert das eine Datenbankverbindung besteht, ggf. auch zusätzlich eine SSH-Verbindung zum Server, dann das Statement an die Datenbank absetzt) Das Vorgehen ist bsiher sehr beschränkt, man ruft im wesentlichen entweder "executeUpdate(String query)" oder "getPreparedStatement()" mit anschließendem "executePreparedStatement(PreparedStatement statement)" auf.
Was mir nicht gefällt:
a) SQL-Code überall im Projekt
b) Keine Transaktionen möglich da die Datenbank-Klasse nicht weiß welche Transaktionen zusammengehören
c) Die Datenbank-Klasse muss ich jeder Klasse per Konstruktor mitgeben oder als Parameter bei nur von extern aufgerufenen Methoden, aufgrund der Hierachie muss ich desshalb teilweise Daten die Datenbank-Klasse mitgeben die sie selbst gar nicht brauchen sondern nur weitergeben
d) Meine 5-6 Datenklassen sind zu mächtig, die sollen abgespeckt werden da sie mittlerweile weitaus mehr Code zum speichern und laden sowie sonstige Zwecke enthalten (z.B. getPrintedLabel() welches ein Label mit allen Druckdaten zurükliefert, recieveParcelStatus() welches die Paketdaten aus dem internet abruft usw.) als eigentliche Daten. Ich denke darüber nach diese zu reinen Datenklassen zu machen, aber wohin lagert man die bisherigen Methoden aus?
e) Zuverlässigkeit und Logging: Da die Abhängigkeit vom Programm immer größer wird und mehr und mehr kritische Bereiche hinzukommen bei denen Fehler ernste Konsequenzen haben muss die zuverlässigkeit möglichst hoch sein und ein Logging eingeführt werden damit Fehler schneller behoben werden können und die Daten eventuell korrigiert werden können. Logging könnte z.B. mit log4j erfolgen, aber da habe ich ja dasselbe Problem wie bei den SQL-Querys=> überall im ganzen Programm verteilt!
Bisher ist die Zuverlässigkeit deutlich zu kurz gekommen, das muss sich ändern
Bin noch Student (Diplom Informatik) und habe schon viel während der Programmierung dieses Projektes gelernt, aber immer nur Try&Error ist doof :wink: daher würde ich mich über ein paar Tipps freuen.
Über Hibernate hab ich schon einiges gelesen und mich informiert, was mir aber nicht ganz klar ist ob dies auch für die überall verteilten SQL-Abfragen (welche nichts mit laden oder speichern von daten zur Objektertsellung zu tun haben) einen sinnvollen Ansatz darstellen kann. Solch eine Abfrage enthält z.B. die Anweisung alle Rechnungsnummern zu liefern die Artikel x enthalten oder alle Rechnungen von einem Kunden mit dem Namen xy oder den zur Rechnung gehörigen Auftrag bzw. umgekehrt oder alle Paketnummern die zu einem Auftrag gedruckt wurden usw.
Wie gesagt, würde mich über ein paar Tipps freuen!