JAVA hängt nach SQL Abfrage

Status
Nicht offen für weitere Antworten.

Die4Me

Mitglied
Hi,
ich hab folgendes Problem mit Java.
Ich arbeite an einem Projekt, welches sich zu einer DB verbindet, relativ große Datensätze ausliest und diese Daten dann auswertet.
Als Datenbank nutze ich zur Zeit MySQL5 und MySQL4 und als Schnittstelle nutze ich den JDBC von MySQL.
nun habe ich da nun ein großes Problem. Immer, wenn ich ca 50000 Datensätze auslese, dann bleibt Java hängen und ih weiss nicht, woran das liegt.
Bemergkbar macht sich das wie folgt.
Ich übergebe dem Programm meine Anfrage und ich sehe, dass dies die Daten läd, durch eine Prozentanzeige.
Sind diese dann geladen, dann erscheinen auf der GUI die berechneten Daten.
Danach hängt das Programm und ich weiss nicht warum.
Folgende klasse habe ich geschrieben, um eine Verbindung herzustellen:
Code:
import java.sql.*;
/**
 * Beschreiben Sie hier die Klasse Sql.
 * 
 * @author SKoschmieder
 * @version 21.12.2005
 */
public class Sql
{
    Connection c;
    
    /**
     * Konstruktor fuer Objekte der Klasse Sql.
     * Dieser installiert den jdbc-Treiber
     */
    public Sql()
    {
        try
        {
            Class.forName ("com.mysql.jdbc.Driver").newInstance ();
        }
        catch (Exception ex)
        {
        }
    }

    /**
     * mysql_connect () - Verbindet sich zu einer Datenbank
     * 
     * @param       url         Server
     * @param       user        Nutzer
     * @param       password    Passwort
     * @return      boolean
     */
    public boolean mysql_connect (String url, String user, String password)
    {
        try
        {
            c = DriverManager.getConnection (url, user, password);
            return true;
        }
        catch (SQLException se)
        {
            return false;
        }
    }
    
    /**
     * mysql_select () - Sendet eine Anfrage an die MySQL-Datenbank und gibt das Ergebnis als ResultSet zurueck
     * 
     * @param   sql     sql-Anfrage
     * @return  ResultSet
     */
    public ResultSet mysql_select (String sql)
    {
        try
        {
            Statement s = c.createStatement ();
            return s.executeQuery (sql);
        }
        catch (SQLException e)
        {
            return null;
        }
    }
    
    /**
     * mysql_entry () - Wird benutzt um Datenn in die Datenbak zu schreiben
     * 
     * @param   sql     sql-Befehl
     * @return  boolean
     */
    public boolean mysql_entry (String sql)
    {
        try
        {
            Statement s = c.createStatement ();
            s.execute (sql);
            s.close ();
            return true;
        }
        catch (SQLException se)
        {
            return false;
        }
    }
    
    /**
     * mysql_num_rows () - Zaehlt die zurueckgegebenen Datensaetze in einem ResultSet
     * 
     * @param   rs      ResultSet
     * @return  anz
     */
    public int mysql_num_rows (ResultSet rs)
    {
        try
        {
            int anz = 0;
            while (rs.next ())
            {
                anz++;
            }
            return anz;
        }
        catch (SQLException e)
        {
            return -1;
        }
    }
    
    /**
     * mysql_num_cols () - Gibt die Anzahl der Spalten an
     * 
     * @param   rs  ResultSet
     * @return  anz
     */
    public int mysql_num_cols (ResultSet rs)
    {
        try
        {
            return rs.getMetaData().getColumnCount();
        }
        catch (SQLException e)
        {
            return -1;
        }
    }
    
    /**
     * mysql_fetch_row () - Wandelt das ResultSet in einen String um.
     * 
     * @param   rs      ResultSet
     * @param   pos     Position
     * @return  rs.getString()
     */
    public String[] mysql_fetch_row (ResultSet rs, int pos)
    {
        try
        {
            rs.first ();
            rs.relative(pos);
            String[] res = new String [mysql_num_cols(rs)];
            for (int i = 0; i < res.length; i++)
            {
                res[i] = rs.getString(i+1);
            }
            return res;
        }
        catch (SQLException e)
        {
            return null;
        }
    }
}
Wie folgt sieht dann eine normale Anfrage aus:
Code:
   data = null;
    String sql = textArea1.getText();
    ResultSet result = db.mysql_select(sql);
    int anz = db.mysql_num_rows(result);
    data = new String[anz][];
    for (int i = 0; i < anz; i++)
    {
        data[i] = db.mysql_fetch_row(result,i);
        double percent = ((double)i+1)/(double)anz*100;
        textField1.setText(String.valueOf((int)percent)+"% Datensaetze wurden geladen        ("+(i+1)+"/"+anz+")");
    }
    try
    {
        result.close();
    }
    catch(SQLException e){};
    return data;
Dort ist nur die Prozentanzeige vorhanden, nich die Daten, die berechnet werden sollen.
ausserdem wollte ich noch sagen, dass ich mich auf eine ArrayNegativeSizeException abgesichert habe, da ich die Exception wieder abfange.
Dies habe ich nun jedoch raus genommen.
Ich wäre dankbar für jede Hilfe.

mfg
die4me

Edit:
sry, hab noch vergessen was zu sagen.
Je mehr Datensätze ich auslese, um so länger hängt das Programm.
Also, es ist schon so, dass es nach einer weile wieder funktioniert.
 

Caffè Latte

Bekanntes Mitglied
Hi,

das kann ein Speicherproblem sein. Monitore mal dein Programm, z.B. mit der JConsole. Es hat auch noch nie geschadet Objekte, die man nicht braucht auf "null" zu setzen, also z.B. bei dir den result. Das erleichtert dem Garbage Collector die Arbeit.

Wenn es daran nicht liegt würde ich mal den DB-Server überwachen. Und wenn es an dem auch nicht liegt das Netzwerk ...
 

bronks

Top Contributor
Die4Me hat gesagt.:
... ca 50000 Datensätze auslese, dann bleibt Java hängen und ih weiss nicht, woran das liegt.
... dann erscheinen auf der GUI die berechneten Daten ...
So große Datenmengen zu halten ist schon ein Problem. So große Datenmengen sollte man nicht einlesen, weil es auch so keinen Sinn macht und es ein performacetechnisches Desaster ist. Die Berechnungen sollte die Datenbank durchführen und die fertigen Ergebnisse liefern.
 

Die4Me

Mitglied
Ich werde probieren, alle diese Berechnungen über die Datenbank laufen zu lassen.
Jedoch denke ich, dass 50000 Datensätze noch wenig sind. Denn das Programm sollte mit Datensätzen klar kommen, welche sich so bei 2 Mio bewegen. Dort sind dann 50000 wenig... :?
naja.
ich werde mich denn nun mal langsam ran machen und all diese Sachen über die Datenbank berechen.
Jedoch dachte ich, dass Javas Stärken in der berechnung liegen und es dort sehr schnell sein sollte.
thx for help
die4me
 

Die4Me

Mitglied
Jedoch hätte ich noch einen Nachtrag.
wie kommt es, dass ich mit PHP die Datensätze gut auslesen kann?
PHP ist in der Sache ziemlich schnell.
auch der MySQL Query Browser.
Wie wird dort das Problem mit den Datenmengen gelöst?
 

bronks

Top Contributor
Die4Me hat gesagt.:
Jedoch hätte ich noch einen Nachtrag.
wie kommt es, dass ich mit PHP die Datensätze gut auslesen kann?
PHP ist in der Sache ziemlich schnell.
auch der MySQL Query Browser.
Wie wird dort das Problem mit den Datenmengen gelöst?
PHP hält die Daten nicht. PHP ist nur ein Script, welches schnell mal durchläuft und danach nichts mehr davon weiß, daß es überhaupt schon mal gelaufen ist. In PHP gibt es keine Arrays. Den Usern wird zwar dauernd erzählt, daß es welche sind, aber in wirklichkeit ist das ein Map. In Java gibt es unterschiedliche Statement- und ResultSetTypen, welche je nach Anwedungsfall spezielle Vorteile bieten.

Der QueryBrowser ließt seitenweise ...

In Deinem o.g. Code sind auch so ein paar ziemlich unbrauchbare Sachen drin. Statt den Arrays solltest Du Maps oder Collections verwenden. Die Art Sätze zu zählen, wie in mysql_num_rows, ist das schlimmste was ich je gesehen habe. Wenn dann mit:

Code:
rs.last();
int numRows = rs.getRow();

Insgesamt sieht der Code leider nicht sehr nach Java aus. Zum einen werden nicht die üblichen techniken verwendet und ich empfehle Dir außerdem die JavaCodeConventions zu lesen bevor Du Dir diese Schreibeweise angewöhnst.
 

Die4Me

Mitglied
Als erstes wollt ich nur mal erwähnen, dass Java und MySQL nur eine Notwendigkeit ist.
und als zweites, ich arbeite noch nicht allzulange mit Java. sind erst 2 Jahre oder so.
Ich tue dies auch nicht auf professioneller Basis. Ist halt "nur" nen Abi-Thema.
Damit meine ich, ich hab mich bis her nicht tiefergreifend mit java beschäftigt.

Und damit meine ich auch, dass ich noch nie was von Maps oder Collections gehört hab.
Ich kenne höchstens noch Listen, weiss aber nicht, ob die für dies programm geeignet wären...
 

Die4Me

Mitglied
Hi, ich habs nun mal mit ner HashMap probiert.
Jedoch ist diese ca 1sekunde langsamer als ein Array, bei ca 57000 Datensätzen.
ich weiss nu nicht, wie das mit der konvertierung zu anderen werten ist, da ich dies bis her noch nicht testen konnte.

zumindest, sieht meine SQL-Klasse nu folgendermaßen aus:
Code:
import java.sql.*;
import java.util.HashMap;
/**
 * Beschreiben Sie hier die Klasse Sql.
 * 
 * @author SKoschmieder
 * @version 21.12.2005
 */
public class Sql
{
    Connection c;
    
    /**
     * Konstruktor fuer Objekte der Klasse Sql.
     * Dieser installiert den jdbc-Treiber
     */
    public Sql()
    {
        try
        {
            Class.forName ("com.mysql.jdbc.Driver").newInstance ();
        }
        catch (Exception ex)
        {
        }
    }

    /**
     * mysql_connect () - Verbindet sich zu einer Datenbank
     * 
     * @param       url         Server
     * @param       user        Nutzer
     * @param       password    Passwort
     * @return      boolean
     */
    public boolean mysql_connect (String url, String user, String password)
    {
        try
        {
            c = DriverManager.getConnection (url, user, password);
            return true;
        }
        catch (SQLException se)
        {
            return false;
        }
    }
    
    /**
     * mysql_select () - Sendet eine Anfrage an die MySQL-Datenbank und gibt das Ergebnis als ResultSet zurueck
     * 
     * @param   sql     sql-Anfrage
     * @return  ResultSet
     */
    public ResultSet mysql_select (String sql)
    {
        try
        {
            Statement s = c.createStatement ();
            return s.executeQuery (sql);
        }
        catch (SQLException e)
        {
            return null;
        }
    }
    
    /**
     * mysql_entry () - Wird benutzt um Datenn in die Datenbak zu schreiben
     * 
     * @param   sql     sql-Befehl
     * @return  boolean
     */
    public boolean mysql_entry (String sql)
    {
        try
        {
            Statement s = c.createStatement ();
            s.execute (sql);
            s.close ();
            return true;
        }
        catch (SQLException se)
        {
            return false;
        }
    }
    
    /**
     * mysql_num_rows () - Zaehlt die zurueckgegebenen Datensaetze in einem ResultSet
     * 
     * @param   rs      ResultSet
     * @return  anz
     */
    public int mysql_num_rows (ResultSet rs)
    {
        try
        {
            rs.last();
            return rs.getRow();
        }
        catch (SQLException e)
        {
            return -1;
        }
    }
    
    /**
     * mysql_num_cols () - Gibt die Anzahl der Spalten an
     * 
     * @param   rs  ResultSet
     * @return  anz
     */
    public int mysql_num_cols (ResultSet rs)
    {
        try
        {
            return rs.getMetaData().getColumnCount();
        }
        catch (SQLException e)
        {
            return -1;
        }
    }
    
    /**
     * mysql_fetch_row () - Wandelt das ResultSet in einen String um.
     * 
     * @param   rs      ResultSet
     * @param   pos     Position
     * @return  rs.getString()
     */
    public HashMap mysql_fetch_row (ResultSet rs, int pos)
    {
        try
        {
            rs.first ();
            rs.relative(pos);
            int laenge = mysql_num_cols(rs);
            HashMap res = new HashMap(laenge);
            for (int i = 0; i < laenge; i++)
            {
                res.put(i,rs.getObject(i+1));
            }
            return res;
        }
        catch (SQLException e)
        {
            return null;
        }
    }
    
    public long test ()
    {
        mysql_connect("jdbc:mysql://<Server>/<Datenbank>","<User>","<Passwort>");
        long time = System.currentTimeMillis();
        ResultSet rs = mysql_select("SELECT hohe,breitengrad FROM datensatz");
        int anz = mysql_num_rows(rs);
        HashMap data = new HashMap(anz);
        for (int i = 0; i < anz; i++)
        {
            data.put(i,mysql_fetch_row(rs,i));
        }
        try
        {
            rs.close();
        }
        catch(SQLException e) {};
        rs = null;
        return System.currentTimeMillis()-time;
    }
}
die Methode test prüft halt die benötigte Zeit.
Ich würde mich über jegliche weitere Hilfe freuen.
CU und bis her danke
die4me
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
P Reicht finally nicht um DB connections zu schließen in (altem) Java? Datenbankprogrammierung 4
A Java DB Server lässt sich nicht starten Datenbankprogrammierung 3
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
U SQL Server mit Java verbinden Datenbankprogrammierung 5
D SQLite Datenbank in Android Studio (Java) durchsuchen Datenbankprogrammierung 3
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
S Das printen der Ausgabe des Oracle-SQL-Statements in der Java-Eclipse-Konsole funktioniert nicht Datenbankprogrammierung 6
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Noobfrage: Konvertierung von SQL-Datentyp 'timestamp with time zone' in Java-Datentyp Datenbankprogrammierung 3
Zrebna Lediglich interne DB-Verbindungen (Connections) auslesen - mittels Java Datenbankprogrammierung 4
berserkerdq2 Was genau muss ich bei date eingeben, wenn ich in Java eine Spalte definiere, die date ist? Datenbankprogrammierung 1
berserkerdq2 Was kann passieren, wenn ich in java einstelle, dass der Fremdschüssel ein Attribut ist, welches selber kein Primärschlüssel ist? Datenbankprogrammierung 4
berserkerdq2 Foreign key einstellen java Datenbankprogrammierung 4
nikgo Java SQL Ausgabe in Liste o.ä. abspeichern um mit dem Ergbnis "zu arbeiten"? Datenbankprogrammierung 5
S Datenbankprogrammierung in Java unter NetBeans 12 funktioniert nicht! Datenbankprogrammierung 1
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
S ODBC Treiber in Java Editor einbinden Datenbankprogrammierung 3
H Oracle Resize eines Images in Java und Rückgabe des Image als BLOB an die Oracle Datebank Datenbankprogrammierung 14
H Java Class zum komprimieren von Jpeg-Images zum Einbinden in Oracle DB - Bild als blob (in und out) Datenbankprogrammierung 23
V SQLite java.sql.SQLException: no such column: Datenbankprogrammierung 18
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
D Daten aus der Firebase-Echtzeitdatenbank abfragen und in Variablen speichern (JAVA) Datenbankprogrammierung 0
Slaylen Java List Suchen mit eigenem Generischen Datentyp Datenbankprogrammierung 10
N java sql abfrage bestimmer Datumszeitraum Datenbankprogrammierung 9
D SQL Server Android App: 'int java.lang.String.length()' on a null object reference Datenbankprogrammierung 15
P USER Management in SQL übergreifend auf JAVA Programm Datenbankprogrammierung 1
H MySQL Verbindung Datenbank und Eclipse (Java) Datenbankprogrammierung 5
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
N Java, sql, jar, JDBC-Treiber in Classpath Datenbankprogrammierung 8
N java SQL JAR - Probleme Datenbankprogrammierung 18
N SQL Datenbank Spalte in Java Array Datenbankprogrammierung 2
N SQL-Statement Java Variable in SQL DB einfügen Datenbankprogrammierung 1
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
T Java Spiel Daten speichern Datenbankprogrammierung 1
C Java MySQL check if value exists in database Datenbankprogrammierung 2
N Sqlite DB mit Java wird auf Linuxsystem nicht gefunden Datenbankprogrammierung 9
L Mybatis Datenbankabfragen in Java Datenbankprogrammierung 1
H MariaDB-Zugriff mittels Java SE Datenbankprogrammierung 3
J Java fügt Datensätze ein aber diese werden nicht richtig abgefragt Datenbankprogrammierung 3
S Datenbank MySQL und Java Datenbankprogrammierung 8
S Beispiel-Blockchain + GUI mit Java erstellen Datenbankprogrammierung 0
P Adressadministration mit Java und mySQL Datenbankprogrammierung 14
Trèfle SQLite SQL-Java Änderungen ausgeben Datenbankprogrammierung 1
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
A MySQL Select und Insert in Java Datenbankprogrammierung 15
C Derby/JavaDB Auf Variable aus Link in java server page zugreifen Datenbankprogrammierung 4
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
F MySQL Einfügen von Datensätzen über Java Datenbankprogrammierung 8
B CSV in Java einbinden und Rechnung Datenbankprogrammierung 7
L Speicherverbrauch Java Anwendung mit einer Datenbankanbindung Datenbankprogrammierung 19
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
L Java- Zähle alle Werte aus der Tabelle von aktiver Zelle Datenbankprogrammierung 12
S Datenbank/Java true/false Datenbankprogrammierung 8
S Java und SQL-Befehle Datenbankprogrammierung 6
L INSERT INTO Befehl in Java Datenbankprogrammierung 8
L Datenbankprogrammierung mit Java und phpMyAdmin Datenbankprogrammierung 4
Korvinus Java mit Cassandra verbinden Datenbankprogrammierung 18
M SQL-Statement SQL mit Java, Update Fehler Datenbankprogrammierung 1
D Installation von MariaDB in java und eclipse Datenbankprogrammierung 2
H Datenbank Export mit Java Datenbankprogrammierung 3
I MariaDB-Verbindung in JAVA Datenbankprogrammierung 11
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29
W Daten in Java intern abfragen Datenbankprogrammierung 1
W MySQL Ausgabe von Datenbank in Java-App Datenbankprogrammierung 6
D Java Datenbanken Datenbankprogrammierung 1
Y H2 H2 foreign key in Spark Java ausgeben Datenbankprogrammierung 1
J Java Eclipse Hilfe beim Programmieren Datenbankprogrammierung 7
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
R Java-Befehle/Operatoren für copy&paste Datenbankprogrammierung 2
C Mit asm laufende Java Anwendung manipulieren Datenbankprogrammierung 1
W Wie liest dieses Java-Programm der Compiler? Datenbankprogrammierung 3
K Java Datenbank auslesen Datenbankprogrammierung 8
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
K HSQLDB .sql Script Aufruf über Java Datenbankprogrammierung 7
B Java Programm und Dantebank umlagern Datenbankprogrammierung 25
B MySQL bplaced Datenbank mit Java ansprechen Datenbankprogrammierung 11
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
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
O PostgreSQL Java Row Index erhalten Datenbankprogrammierung 1
dzim Cassandra Cluster DB und der Java-Treiber Datenbankprogrammierung 1
H Entity in Java implementieren Datenbankprogrammierung 13
V Fehler beim Generierung Fehler beim Generierung java.lang.ArrayIndexOutOfBoundsException: 0 Datenbankprogrammierung 12
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
D MySQL Many to Many Tabellen in Java abbilden? Datenbankprogrammierung 4
P Datanbank für Java-Programmierung Datenbankprogrammierung 10
F Java SQLite Error Datenbankprogrammierung 19
F SQL Datenbank an Java Code anbinden Datenbankprogrammierung 5
J Java 8 und Microsoft Access Database-Dateien(mdb) Datenbankprogrammierung 1
H HSQLDB Beim öffnen folgender Fehler: ... java.lang.NullPointerException Datenbankprogrammierung 1
H SHOW Tables in Java/MySQL Datenbankprogrammierung 8
M Verbindung von Java Programm zur Acccess Datenbank (mdb-Datei) Datenbankprogrammierung 0
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
M Wie übergebe ich Datenbankobjekte aus einer sql-Datenbank einer Java Klasse bzw. Instanz Datenbankprogrammierung 7
D Zeit von SQL nach Java Datenbankprogrammierung 2
M JAVA Derby INSERT probleme Datenbankprogrammierung 12
M Java Datenbankanbindung funktioniert nicht Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben