Spalten einer SQL-Anfrage vorhersagen

Hallo alle zusammen und willkommen zu meinem ersten Post! ;)

Ich arbeite gerade an der Integration von SQL-Datenbanken (mit JDBC) in ein größeres Projekt. Dabei sollen Daten ausgelesen und anschließend mit verschiedenen Algorithmen weiterverarbeitet werden. Die Datenmengen bewegen sich dabei schlimmstenfalls im Terrabyte-Bereich und deswegen ist das Vorgehen nicht so straight-forward, wie es vielleicht bei kleinerem Umfang der Fall wäre.
Konkret heißt das, dass ich das "Aussehen" eines ResultSets (also z.B. die Spaltennamen oder die Typen in den einzelnen Spalten) gerne vorhersagen würde, bevor die tatsächliche (eventuell sehr ressourcenintensive) Anfrage gestellt wird.

Die momentan von mir verfolgte Weg besteht darin nach der Verbindungsaufnahme den Produktnamen der Datenbank zu erfragen, um dann abhängig davon die Anfrage so zu verändern, dass das ResultSet nur eine Zeile enthält (z.B. per TOP bei SQL Server oder LIMIT bei MySQL).

Java:
/* Minimalbeispiel:
 * Dabei sind 'URL', 'benutzer', 'passwort' und anfrage 'jeweils' Strings,
 * die als Parameter übergeben wurden:
 */

Connection verbindung = DriverManager.getConnection(URL, benutzer, passwort);
String dbname = verbindung.getMetaData().getDatabaseProductName();
String neueAnfrage = transformiereAnfrage(anfrage, dbname);
ResultSet ergebnis = statement.executeQuery(neueAnfrage);

/* über die Metadaten von 'ergebnis' kann ich dann alle nötigen Informationen
 * auslesen
 */

Trotz längerer Suche ist es mir aber nicht gelungen herauszufinden, was genau die Anfrage in Zeile 7 für die verschiedenen Datenbanken zurück gibt. :bahnhof: Ich vermute aber schon, dass diese Information irgendwo vorhanden ist - kann mir jemand die Augen öffnen?

Ich nehme natürlich auch gerne alternative Vorschläge an, die mein Problem lösen könnten.
 
Hi Manuela!

Danke für den Link, aber der hilft mir - meiner Meinung nach - nicht weiter. Zu einem ResultSet die Metadaten zu erfragen und auszuwerten ist kein Problem. Im Gegenteil: genau das habe ich vor. Aber ohne dass die ganze Anfrage gestellt wird.

Hintergrund:
Die durch die Anfrage erhaltenen Daten sollen anschließend mit verschiedenen - und zur Kompilierzeit nicht feststehenden - DataMining-Algorithmen weiterverarbeitet werden. Dabei soll im ersten Schritt geprüft werden, ob das Ergebnis der Anfrage eine gültige Eingabe für den Algorithmus ist, damit nicht eine - unter Umständen komplizierte - Anfrage an eine 2TB große Datenbank gestellt wird, um dann festzustellen, dass das ResultSet keine gültige Eingabe für den folgenden Algorithmus ist.
Ich möchte also diesen Test implementieren.

Meine momentanen Herangehensweise besteht darin, die Anfrage so zu modifizieren, dass das Ergebnis nur einen Datensatz (also eine Zeile) enthält, denn ich hoffe, dass diese Berechnung wesentlich schneller abgeschlossen ist, als die Berechnung der ursprünglichen Anfrage. Dummerweise unterscheiden sich die Befehle zur Limitierung des Ergebnisumfangs von Datenbank zu Datenbank (eben z.B. TOP bei SQL Server und LIMIT bei MySQL) und deswegen möchte ich den Namen der Datenbank erfragen (Zeile 7 im obigen Minimalbeispiel) und dann abhängig davon die Anfrage transformieren (Zeile 8).

Leider weiß ich nicht, was die Methode getDatabaseProductName() für die verschiedenen Datenbanken zurückgibt (konkret: ergibt das bei einer Anfrage an eine MySQL-Datenbank den String "MySQL"?) und genau das ist meine Frage an euch. Da muss es doch eine Übersicht oder sonst zumindest eine Dokumentation in der entsprechenden JDBC-Treiberumsetzung für die verschiedenen Datenbanken geben! Aber z.B. bei SQL Server sieht diese so aus: getDatabaseProductName Method (SQLServerDatabaseMetaData)
Das hilft mir auch nicht weiter...
 

madboy

Top Contributor
Ich würde den DB-Typ nicht aus den Metadaten holen. Klingt mir zu "unsicher". Wenn eine neue DB-Version einen anderen String zurück liefert musst du jedes Mal den Code anpassen.
Vorschlag:
Dort, wo du die Verbindung zur DB erstellst, weißt du schon was für eine DB es sein soll. Abhängig davon würde ich eine Klasse instanziieren, die eine Abfrage erstellen kann, wie du sie brauchst.

Java:
public interface DbUtil {
public String getLimitQuery(String select, String from, String where);
}

public class MySqlDbUtil implements DbUtil {
public String getLimitQuery(String select, String from, String where) {
   return select + from + where + " LIMIT ...";
}
}

...

statement.executeQuery(dbUtil.getLimitQuery(select, from, where));

Wahrscheinlich willst du auch weitere DB spezifischen Queries absetzen. Mit dem Vorschlag hast du dann alle spezifischen SQLs in einer zentralen Klasse und nicht über den kompletten Code verstreut.
 

Michael...

Top Contributor
Wenn ich das richtig verstanden habe willst Du an die Metadaten eines ResultSets bevor das Statement ausgeführt wurde.
Man könnte vor der Ausführung des Statements ein Kopie des Statements ausführen in dessen Where Klausel man eine Bedingung ala
Code:
and 1>1
untergejubelt hat. Liefert eine leere Ergebnismenge aber die Metadaten des ResultSets.
 
Ich würde den DB-Typ nicht aus den Metadaten holen. Klingt mir zu "unsicher". Wenn eine neue DB-Version einen anderen String zurück liefert musst du jedes Mal den Code anpassen.
Das stimmt wohl.
Dort, wo du die Verbindung zur DB erstellst, weißt du schon was für eine DB es sein soll.
Mittlerweile ermittelt der DriverManager selber, auf welche Art Datenbank die URL verweist und wählt dann den passenden Treiber - im obigen Code weiß ich also nicht, mit welcher Datenbank ich verbunden bin.


Man könnte vor der Ausführung des Statements ein Kopie des Statements ausführen in dessen Where Klausel man eine Bedingung ala
Code:
and 1>1
untergejubelt hat. Liefert eine leere Ergebnismenge aber die Metadaten des ResultSets.
Darauf hätte ich auch selber kommen können/sollen. Danke, Michael! :)
 

DerEisteeTrinker

Bekanntes Mitglied
Probier es mal mit einem AbstractFactory-Pattern in Verbindung mit DAOs, da kannst das gut automatisieren, wenn du bei der Verbindungsaufnahme weißt, welche Datenbank verbunden wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
P Derby/JavaDB JPA Reihenfolge Spalten ändern Datenbankprogrammierung 6
C PostgreSQL Anzahl der Spalten ermitteln Datenbankprogrammierung 2
E Wie kann man BLOB-Spalten in DB2 einfügen? Datenbankprogrammierung 9
E Kann man in DB2 Boolean Spalten erstellen? Datenbankprogrammierung 1
M JDBC Tabellen mit Boolean Spalten können nicht erstellt werden. DB Updaten - wie? Datenbankprogrammierung 6
D Aufteilung ähnlicher Spalten Datenbankprogrammierung 2
M DES und ASC auf verschiedene Spalten anwenden Datenbankprogrammierung 2
S MySQL Befüllen von mehreren Spalten Datenbankprogrammierung 1
I Was ist besser: Tabellen oder Spalten Datenbankprogrammierung 1
V Hibernate und optionale Spalten? Datenbankprogrammierung 2
turmaline [HQL] Dynamische Spalten erzeugen Datenbankprogrammierung 14
R MySQL Unbenutzte Tabellen/Spalten herausfinden Datenbankprogrammierung 7
O DefaultTableModel Spalten ausblenden Datenbankprogrammierung 3
N Zwei Spalten und Ihre Werte vergleichen Datenbankprogrammierung 3
H Group By mit mehreren Spalten Datenbankprogrammierung 2
multiholle SQL Querry über mehrere Spalten Datenbankprogrammierung 12
G Spalten definieren Datenbankprogrammierung 5
A MSSQL - Spalten mit der Option: NULL zulassen Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
H Individuelle Datenbankfelder/-spalten wie realisieren? Datenbankprogrammierung 3
W Anzahl der Spalten eines ResultSets bestimmen Datenbankprogrammierung 5
Y Hibernate - Update bestimmter Spalten Datenbankprogrammierung 2
G Spalten Namen auslesen und Zeilen daten auslesen Datenbankprogrammierung 17
G maximale Länge von Spalten ermitteln Datenbankprogrammierung 3
M Maximum aus verschiedenen Spalten Datenbankprogrammierung 2
J Alle Spalten und Zeilen eines ResultSets ausgeben ? Datenbankprogrammierung 2
R getString() auf double-Spalten(DECIMAL) Nachkommastellen weg Datenbankprogrammierung 2
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
D Zweckmäßigkeit einer Schlüsseltabelle Datenbankprogrammierung 4
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
S Variable in main soll mit der generierten Zahl aus einer Methode ausgefüllt werden Datenbankprogrammierung 3
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
T Datenbank auf einer Webseite aus einer Exceltabelle erstellen Datenbankprogrammierung 5
D JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht Datenbankprogrammierung 3
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
P Verbindung zu einer Access Datenbank per Eclipse oder Intellij Datenbankprogrammierung 0
pkm Frage zu Encodingproblem bei einer Datenbankanbindung Datenbankprogrammierung 1
B Frage bei einer SQL Query Datenbankprogrammierung 3
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
J In einer bestimmten Spalte suchen mit Suchfeld (MS SQL) Datenbankprogrammierung 7
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
J Sql Anfrage nach einer Zeile beenden Datenbankprogrammierung 6
J Welche Kriterien haben Einfluss auf die Geschwindigkeit einer Datenbank ? Datenbankprogrammierung 4
S Anmelden an einer msql datennbank Datenbankprogrammierung 1
F Auslesen einer .dbf-Datei, Zuordnung Index Datenbankprogrammierung 0
ralfb1105 Oracle Zwei ojdbc Driver in einer Applikation? Datenbankprogrammierung 13
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
Dimax MySQL 10 höchsten Werte aus einer Tabelle ermitteln Datenbankprogrammierung 30
L Speicherverbrauch Java Anwendung mit einer Datenbankanbindung Datenbankprogrammierung 19
temi Wie kann ich "Class" in einer DB speichern? Datenbankprogrammierung 2
F UPDATE - Befehl nur in einer Zeile Datenbankprogrammierung 11
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
DaCrazyJavaExpert Derby/JavaDB Wert einer Variable in der Datenbank direkt auf 1 setzten. Datenbankprogrammierung 71
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
F Java Objekte in einer Datenbank speichern Datenbankprogrammierung 4
MrSnake Hilfe bei erstellen einer DB Datenbankprogrammierung 12
M Wie übergebe ich Datenbankobjekte aus einer sql-Datenbank einer Java Klasse bzw. Instanz Datenbankprogrammierung 7
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
E Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? Datenbankprogrammierung 17
E Warum funktioniert das Erzeugen einer View nicht? Datenbankprogrammierung 1
E Kann man in einer if-Bedingung auch SELECT-Statements überprüfen? Datenbankprogrammierung 23
E Was sind die Vorteile von DB2 im Gegensatz zu einer Oracle-Datenbank? Datenbankprogrammierung 5
E Wie geschieht der konzeptueller Entwurf einer Datenbank Datenbankprogrammierung 1
I SQLite Objekt speichern einer Serialisierter Klasse Datenbankprogrammierung 1
D HSQLDB INSERT INTO in einer For Schleife mit selber ID, machbar? Alternative? Datenbankprogrammierung 7
I Inhalt einer hsqldb anzeigen Datenbankprogrammierung 1
J Realisierung einer DB in Combi mit Java Datenbankprogrammierung 13
Androbin [Serializing] Mehrere Objekte in einer einzigen Datei speichern Datenbankprogrammierung 1
S Auswahl einer Datenbank Datenbankprogrammierung 0
M Derby/JavaDB Speicherplatz einer Zeile bestimmen Datenbankprogrammierung 0
P JPA in einer größeren Java SE Anwendung Datenbankprogrammierung 0
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
L MySQL Uhrzeit-Format innerhalb einer Tabelle Datenbankprogrammierung 8
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
S Derby/JavaDB Probleme beim anlegen einer embedded DB Datenbankprogrammierung 13
E Daten einer SQL-Datenbank aus Combobox in labels schreiben Datenbankprogrammierung 6
M Problem beim Erstellen einer Query Datenbankprogrammierung 7
L Datenbankabfrage mit einer Range Datenbankprogrammierung 3
S Anbindung einer Datenbank an Java Datenbankprogrammierung 7
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
eskimo328 Datenbankverbindung ohne Passwort im Quelltext bei einer offline Anwendung Datenbankprogrammierung 14
C unverständliches DB Problem (Es ist kein temporärer Systemtabellenbereich mit einer ausreichenden..) Datenbankprogrammierung 5
A Oracle Update Befehl in Datenbank anhand einer Schleife Datenbankprogrammierung 8
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
S 2 Tabellen zu einer zusammenführen, INSERT INTO Fehler Datenbankprogrammierung 5
D Sperrverfahren in einer Datenbank Datenbankprogrammierung 6
B Feld in einer @Entity als Text speichern Datenbankprogrammierung 5
G Oracle Hibernate M:N-Beziehung mit nur einer vorhandenen Tabelle Datenbankprogrammierung 5
M MySQL Auto-Increment einer custom formatted id? Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
M DB: Mehrere Zeilen in einer Zeile zusammenführen Datenbankprogrammierung 10
D Probleme bei der Erzeugung einer Tabelle Datenbankprogrammierung 15
D Frage zu potenziellen Leerzeichen in einer Datenbank Datenbankprogrammierung 5
H datantyp einer variable ermittel mit sql Datenbankprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben