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:
Wie folgt sieht dann eine normale Anfrage aus:
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.
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;
}
}
}
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;
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.