Hallo,
ich möchte gerne Daten aus einer Datenbanktabelle mit ca. 13000 Zeilen und 73 Spalten (pro Zeile ca. 500 Byte (ca. 35 Spalten sind Text der Rest Zahlen)) in einer JTable anzeigen lassen.
Die Daten lese ich mittels getString, getInt usw. ein. (vorher nur getString verbrauchte aber ca. 10 MB mehr Speicher).
Alleine für die doch recht wenigen Daten benötige ich ca. 30 MB Speicher(ohne VM). Da diese Abfrage aber auf 35 Datenbanken laufen muss bräuchte ich über 1 GB Arbeitsspeicher. (Ein Test über 4 Datenbanken ergabe sogar einen Speicherverbrauch von über 200 MB )
Woran kann dies liegen und gibt es eine Möglichkeit den Speicherverbrauch zu verringern?
Dies kann doch nicht nur an der höheren Speicherallokierung für Zeichenketten (String Kodierung) liegen oder?
ich möchte gerne Daten aus einer Datenbanktabelle mit ca. 13000 Zeilen und 73 Spalten (pro Zeile ca. 500 Byte (ca. 35 Spalten sind Text der Rest Zahlen)) in einer JTable anzeigen lassen.
Die Daten lese ich mittels getString, getInt usw. ein. (vorher nur getString verbrauchte aber ca. 10 MB mehr Speicher).
Alleine für die doch recht wenigen Daten benötige ich ca. 30 MB Speicher(ohne VM). Da diese Abfrage aber auf 35 Datenbanken laufen muss bräuchte ich über 1 GB Arbeitsspeicher. (Ein Test über 4 Datenbanken ergabe sogar einen Speicherverbrauch von über 200 MB )
Woran kann dies liegen und gibt es eine Möglichkeit den Speicherverbrauch zu verringern?
Dies kann doch nicht nur an der höheren Speicherallokierung für Zeichenketten (String Kodierung) liegen oder?
Code:
public void run() {
Connection con = null;
try {
synchronized (Main.lock) {
con = DriverManager.getConnection(wci.getConnectionString(), wci.getUserName(), wci.getPassword());
}
final Statement stmt = con.createStatement();
final ResultSet rs = stmt.executeQuery(query);
final ResultSetMetaData rsMetaData = rs.getMetaData();
final int columnCount = rsMetaData.getColumnCount();
final Vector<String> columnDesc = new Vector<String>();
final Vector<Vector<Object>> result = new Vector<Vector<Object>>(15000);
for (int i = 1; i <= columnCount; i++) {
columnDesc.add(rsMetaData.getColumnName(i));
}
while (rs.next()) {
Vector<Object> rowValues = new Vector<Object>(columnCount);
for (int i = 1; i <= columnCount; i++) {
switch (rsMetaData.getColumnType(i)) {
// String CHAR (1), VARCHAR (12), LONGVARCHAR(-1)
case 1:
case 12:
case -1:
rowValues.add(rs.getString(i));
break;
// java.math.BigDecimal NUMERIC (2), DECIMAL (3)
case 2:
case 3:
rowValues.add(rs.getBigDecimal(i));
break;
// boolean BIT (-7)
case -7:
rowValues.add(rs.getBoolean(i));
break;
// byte TINYINT (-6)
case -6:
rowValues.add(rs.getByte(i));
break;
// short SMALLINT (5)
case 5:
rowValues.add(rs.getShort(i));
break;
// int INTEGER (4)
case 4:
rowValues.add(rs.getInt(i));
break;
// long BIGINT (-5)
case -5:
rowValues.add(rs.getLong(i));
break;
// float REAL (7), FLOAT (6)
case 6:
rowValues.add(rs.getFloat(i));
break;
// double DOUBLE (8)
case 8:
rowValues.add(rs.getDouble(i));
break;
// java.sql.Date DATE (91)
case 91:
rowValues.add(rs.getDate(i));
break;
// java.sql.Time TIME (92)
case 92:
rowValues.add(rs.getTime(i));
break;
// java.sql.Timestamp TIMESTAMP (93)
case 93:
rowValues.add(rs.getTimestamp(i));
break;
}
}
result.add(rowValues);
}
queryResult = new QueryResult(columnDesc, result);
stmt.close();
rs.close();
} catch (final Exception ex) {
ex.printStackTrace();
} finally {
if (con != null) {
try {
con.close();
} catch (final SQLException e) {
e.printStackTrace();
}
}
}
}
Zuletzt bearbeitet: