Zum Inhalt springen

Probleme mit JDBC


LadyPreis

Empfohlene Beiträge

Hallo zusammen. Ich schreibe gerade ein kleines Verwaltungstools für unsere DB2 Datenbank. Generell ist die komplette Funktionalität implementiert, jedoch habe ich an einigen Stellen doch ein paar Probleme.

Folgendes Problem: In meinem Code wird ein Select-Statement dynamisch erzeugt, welches danach mittels executeQuery ausgeführt wird. Bei kleineren Datenmengen im ResultSet funktioniert dies auch ohne Probleme. Aber bei größeren Abfragen (im Test u.a. joins über ca 20 Tabellen inkl. Union) friert meine Oberfläche einfach ein. Am erzeugten Statement liegt es nicht, da eine 1:1-Kopie des Statement mittels Squirrel innerhalb von 2 Sekunden erledigt ist.

Hat jemand eine Idee, womit dies zusammen hängen könnte?

Achja: An der Datenbank liegt es nicht. Im Monitoring der DB ist klar zu sehen, dass eine Anfrage von meinem Tool kam, diese bearbeitet und zurückgeschickt wurde.

Gruß

Die Lady

Link zu diesem Kommentar
Auf anderen Seiten teilen

wie gross ist denn die datenmenge die dir zurueckgegeben wird?

ich kenn es halt von PHP/mySql - das der IE gerne einfriert wenn man einfach zuviel output hat.

und haste mal versucht dir das Result einfach nur in eine Datei wegzuschreiben ohne es zu weiter zu verarbeiten? Vielleicht ist auch das was du mit den daten danach machen moechtest zuviel.

Ted

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Datenmenge ist verhältnissmäßig klein (im Squirrel 738 Datensätze). Füge ich an mein SQL jedoch noch eine Bedingung zusätzlich an, bekomme ich ein ResultSet (112 Datensätze). Daher geh ich davon aus, dass es doch etwas mit der Menge im Result zu tun hat.

Wem es hilft:

Hier mein SQL-Statement, bei dem mein Programm einfriert

SELECT e.* FROM TableA a 

INNER JOIN TableB b 

ON a.SpalteA = b.SpalteA 

INNER JOIN TableC c 

ON b.SpalteB = c.SpalteB 

INNER JOIN TableD d 

ON c.SpalteB = d.SpalteB 

INNER JOIN TableE e 

ON e.SpalteC = d.SpalteC 

WHERE e.SpalteD LIKE '%' 

AND a.SpalteA = 1000 

UNION ALL 

SELECT d.* FROM TableA a 

INNER JOIN TableB b 

ON a.SpalteA = b.SpalteA 

INNER JOIN TableC c 

ON b.SpalteB = c.SpalteB 

INNER JOIN TableD d 

ON d.SpalteC = b.SpalteC 

WHERE d.SpalteD LIKE '%' 

AND a.SpalteA = 1000 

UNION ALL 

SELECT e.* FROM TableA a 

INNER JOIN TableB b 

ON a.SpalteA = b.SpalteA 

INNER JOIN TableC c 

ON b.SpalteB = c.SpalteB 

INNER JOIN TableD d 

ON c.SpalteB = d.SpalteB 

INNER JOIN TableE e 

ON d.SpalteC = e.SpalteC 

WHERE e.SpalteD LIKE '%' 

AND a.SpalteA = 1000 

FOR READ ONLY WITH UR
Zusätzlich noch mein Java-Code
public static ArrayList<String[]> getDBResults(String query) {


        try {

            Class.forName(Tools.DB2_CLASS);

        } catch (ClassNotFoundException e) {

            //logging

        }

        Connection conn = null;

        Statement stmt = null;

        ResultSet rs = null;

        try {

            conn = DriverManager.getConnection(Tools.URL, Tools.USER, Tools.PASS);

            stmt = conn.createStatement();

            System.out.println(query);


            [COLOR="Red"]rs = stmt.executeQuery(query);[/COLOR]


            ArrayList<String[]> zeilen = new ArrayList<String[]>();

            int columnCount = rs.getMetaData().getColumnCount();

            while (rs.next()) {

                String[] row = new String[columnCount];

                for (int i = 1; i <= columnCount; i++) {

                    row[i - 1] = rs.getString(i);

                }

                zeilen.add(row);

            }

            return zeilen;

        } catch (SQLException ex) {

            //logging

        }

        return null;

    }

am rot markierten Bereich bleibt die Anwendung stehen

Werde darsu nicht schlau.

Link zu diesem Kommentar
Auf anderen Seiten teilen

mit Java kenn ich mich nicht so aus... also da kann ich nich wirklich viel zu sagen.

Aber das Problem haengt meiner Meinung nach eh am Query.

Wieviel Datensaetze hast ca pro tabelle drin?

Hast du vernuenftige index gesetz?

Da ich dein DBMS ned kenne - versuch mal nen EXPLAIN (zumindest in MYSQL so) davor zu setzen. Daraus kann man meist viel erkennen. Wieviel Datensaetze du "wirklich" hast und wo du eventuell noch n Index setzen solltest.

Die Datenmenge ist verhältnissmäßig klein (im Squirrel 738 Datensätze).

Die ausgegebene Datenmenge ist ja erst das nachdem all deine Bedingungen erfuellt sind...

Ich denke dein Timeout kommt zu stande weil er, ich nehme nun mal 100Datensaetze pro Tabelle als bsp, 100*100*100*100*100 Datensaetze auswerten muss.

Ted

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Anzahl an Datensätzen unterscheidet sich sich von Tabelle zu Tabelle. von 60-9000 ist alles dabei :)

Bezüglich des Index: Die sind vernünftig gesetzt.

Ich denke jedoch, dass es am Java-Code liegt, da mein übergebener SQL-String in anderen Anwendungen (Squirrel, DB2-Entwicklung, andere selbstgeschriebene Programme) ohne Probleme läuft. Diese Anwendungen laufen mit den gleichen Treiber wie meine Anwendung, und sind ebenfalls in Java geschrieben. Also muss es ja irgendwie gehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Verwende, wenn Dein Statement es ermöglicht ein Prepare (wenn Du variable Parameter übergibst)

Entsprechende Indizes wurden ja schon angesprochen. Was sich anbieten würde, das ganze asynchron zu machen, in dem Du das Statement ausführst und dann selbst nach schaust, ob die Daten vorhanden sind. Zusätzlich könnte auch ein Cursor hilfreich sein, mit dem Du nicht einen Snapshot erhälst, sondern immer nur den aktuellen Datensatz auf dem Du stehst. Änderungen usw kannst dann direkt in die Tabelle übernehmen ohne ein Update zu machen.

Aber generell zu Deinem Post, es fehlen Informationen um sinnvoll zu helfen

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

die Parameter sind nicht variabel.

Bezüglich des Cursors: Bisher habe ich noch nicht damit gearbeitet. Da am Freitag Projektübergabe ist, wird das wahrscheinlich auch ein bißchen eng, mich darin einzuarbeiten und meinen Code abzuändern (ich weiß nicht, wie umfangreich das Thema "Cursor" ist). Zudem brauche ich keine Funktionalität zum Ändern der Datensätze. Aber für die Zukunft werde ich mich diesem Thema sicherlich einmal widmen :)

Aber was für Informationen fehlen euch denn, um einen (hoffentlich) erfolgversprechenden Lösungsansatz zu finden?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab es eben hinbekommen. Nach den ganzen Problemen hab ich einfach mal meine importierten Bibliotheken einem Update unterzogen. Und nun geht es. Schien als ein Bug in einer veralteten Version der db2jcc.jar zu sein.

Da hätte ich ja auch mal früher drauf kommen können :upps

Danke

Gruß

Die Lady

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...